Beyin Fırtınası: Java mı yoksa Python mı daha hızlı?

Makinenin (JVM) ısınması lazım :rofl::rofl::grin:

1 Beğeni

Hayır, algoritmadan bahsettim. Yani kod boyutuyla hız orantılı değildir demek istedim. Mesela aşağıdaki fib1() metodu recursive yazılmış ve fib2() metodundan daha kısa. Ama çalışma süresi fib2() den daha uzun.

import java.util.concurrent.TimeUnit;

public class Test {

    static int fib1(int n) {
        if (n <= 1) {
            return n;
        }
        return fib1(n - 1) + fib1(n - 2);
    }

    static int fib2(int n) {
        int sayac = 0, temp = 0;
        int[] dizi = {0, 1};
        while (sayac < n) {
            temp = dizi[0];
            dizi[0] = dizi[1];
            dizi[1] = temp + dizi[1];
            sayac++;
        }

        return dizi[0];
    }

    public static void main(String args[]) {
        int n = 41;
        long start = System.nanoTime();
        System.out.println(fib1(n));
        System.out.println("Fib1 çalıma süresi: "+TimeUnit.NANOSECONDS.toMillis(System.nanoTime()-start));
        
        start = System.nanoTime();
        System.out.println(fib2(n));
        System.out.println("Fib2 çalıma süresi: "+TimeUnit.NANOSECONDS.toMillis(System.nanoTime()-start));
    }
}

Kodu açabilir misiniz biraz :slight_smile:

1 Beğeni

Evet, yazdığımız kod sadece dilin syntax’ı ile alakalı.

Ben de kodu bunun için atmıştım aslında, basit bir optimizasyon ile recursive fonksiyonu gayet hızlı yapabiliyoruz. Sizin örnek verdiğiniz koddaki recursive fonksiyon dallanarak büyüyor (ve aynı hesaplamayı gereksiz bir şekilde defalarca yapmış oluyor), zaten yavaş çalışmasına sebep olan bu. Yani aslında yine buna geliyoruz:

Ama siz burada recursive yaklaşımın kendisi yavaşmış gibi yazmıştınız, o yüzden bir önceki cevabı yazdım:


Tabii.

fmap = lambda o, *f: [q(o) for q in f]

map fonksiyonunun bir argüman ile birden fazla fonksiyon çağıran hali (burada kullanmamın tek sebebi lambda’larda değişken ataması yapılamaması). Örnek:

>>> fmap((1, 2), lambda i: i[0] + i[1], lambda i: i[0] - i[1])
[3, -1]

fib_util = lambda n: fmap(fib_util(n-1), lambda i: i[1], sum) \
           if n \
           else (0, 1)

n, 0 olduğunda yineleme bitiyor ve (0, 1) değeri dönüyor. Geri dönen değer bir üst fonksiyonda fmap((1, 0), lambda i: i[1], sum) halini alıyor. O da [1, 1] haline geliyor, zaten fmap bir liste döndürüyor. Bir üst fonksiyonda da önce fmap([1, 1], lambda i: i[1], sum), sonra da [1, 2] halini alıyor. Bu şekilde sürekli iki elemanın toplamının 1. index, ikinici elemanın ise 0. index olduğu bir liste oluşturuluyor.

fib = lambda n: fib_util(n)[0]

fib_util’den geri dönen değer bir tuple veya list, bize bir sayı lazım. İlkini seçiyoruz. Çünkü fib(0) == 0 şartını ilk eleman sağlıyor, fibonacci dizisinin de ilk elemanı 0.

2 Beğeni

Teşekkür ederim. Evet, söylemek istediğimi biraz daha açmam gerekti.

2 Beğeni

Aslinda atadigimiz “degisken” sabit oldugu icin isimiz kolay. Surada &&& ile cozmusum. Burada:

arrowAnd = lambda f, g: lambda x: (f(x), g(x))
fib_util = lambda n: arrowAnd(lambda i: i[1], sum)(fib_util(n-1)) if n else (0, 1)
fib = lambda n: fib_util(n)[0]

Artik lambda ile cozuyorum:

fib_util = lambda n: (0, 1) if n == 0 else (lambda p: (p[1], p[0] + p[1]))(fib_util(n-1))
fib = lambda n: fib_util(n)[0]

Tabii farklı yöntemler takip edilebilir, benim aklıma map fonksiyonu gelince genel bir şey yapıyım demiştim.

Guzel :slight_smile:

Aslinda applicative functor’un apply fonksiyonuna benziyor:

(<*>) :: Applicative f => f (a -> b) -> f a -> f b

f icin [] verirsek:

(<*>) :: [a -> b] -> [a] -> [b]

a'yi [a] yapip parametreleri cevirmemiz lazim ama onlar zor degil.

Neyin tartışmasını yapıyorsunuz.

En hızlı dil, para kazandiğın dildir.

1 Beğeni

Python da derlenen dil o zaman, pyc olarak derlerim :slight_smile:

derlenenden kastımız direk yerel makine diline derlenmesi kendi özel koduna değil

Makine diline derlenmiyor ki, o da aynı. Öyle olsa is olmadan çalışırdı.

bende java yerel makine koduna derleniyor mu ? diye sormaya çalışıyordum :slight_smile:

Ha yanlış anlamışım. O zaman Java ya yarı derlenen yarı yorumlanan diye niye diyorlar?

Java is a compiled programming language, but rather than compile straight to executable machine code, it compiles to an intermediate binary form called JVM byte code. The byte code is then compiled and/or interpreted to run the program.

kaynak = https://stackoverflow.com/questions/1326071/is-java-a-compiled-or-an-interpreted-programming-language