Python vs JavaScript

TeknoEmir

Hectopat
Katılım
9 Ocak 2021
Mesajlar
394
Daha fazla  
Cinsiyet
Erkek
Yaklaşık 3-4 aydır kodlama ile uğraşıyorum. Python zamanında öğrenmiştim ama bence çok sıkıcı bir dil. JavaScript ile Python'un yaptığı her şeyi yapabilir miyim? Avantajları, dezavantajları nedir? Şimdiden yazan herkese şükranlarımı sunuyorum.
 
JS'nin avantajı daha kapsamlı bir dil olması ve çok çok çok hızlı olması. Eğer JS 10 hızlı ise Python 1 hızlı. Python'un avantajı yazım kolaylığı olması bu sayede komplike çalışmalarda işin zorluğunu bir nebze azaltıyor. Ancak Python sana sıkıcı geldiyse JS'nin eğlenceli geleceğini pek sanmam. Çünkü Python genel olarak daha eğlenceli bir dil olarak yorumlanır. Çünkü yazması oyun gibidir akar gider.
Ancak bu tür karşılaştırmalar yaparken ne yapmak istediğinizi de belirtmelisiniz.
 
JS'nin avantajı daha kapsamlı bir dil olması ve çok çok çok hızlı olması. Eğer JS 10 hızlı ise Python 1 hızlı. Python'un avantajı yazım kolaylığı olması bu sayede komplike çalışmalarda işin zorluğunu bir nebze azaltıyor. Ancak Python sana sıkıcı geldiyse JS'nin eğlenceli geleceğini pek sanmam. Çünkü Python genel olarak daha eğlenceli bir dil olarak yorumlanır. Çünkü yazması oyun gibidir akar gider.
Ancak bu tür karşılaştırmalar yaparken ne yapmak istediğinizi de belirtmelisiniz.

Yazdığın şey tamamen yanlış. JavaScript Single-threaded bir dil. Python ise multithread destekliyor. 1-10 oranı yazdığının tam tersi olmalıydı.
 
Son düzenleyen: Moderatör:
Çoklu thread’de evet. Single thread’de ise deneyip bakmak lazım.

Herhangi bir şekilde teknik anlamda bir açıklama yapmadan birkaç şeye değinmek istiyorum. Sizin gibi yazdıklarından eminmiş gibi davranıp karşı tarafa hakaretimsi cevaplar veren birisi kendisini küçük düşürülmeye itmekten öteye geçemeyeceği bir yolda yürüyor. Bu tarz yapıcı olmayan/hakaret içeren geri dönüşler, genel olarak aşağılık kompleksi tarafından güdülen, kendisini başka insanlardan çirkeflik yoluyla yüceltme çabasında olan insanların davranış biçimi.



Olayı teknik anlamda ele almak istersek, benim de hızlı cevap için atladığım kısa bir iki şeyden bahsedeyim size. Bir dilin başka bir dilden daha "hızlı" oluşu direkt olarak cevap verilebilecek bir şey değil, "hızlı" derken önemli olan hız hangisi? Hangi tür uygulamalarda hız kıyaslıyoruz? Eldeki uygulama CPU bound mu yoksa I/O bound mu? Bu ve benzeri sorulara cevap verdikten sonra bir programlama dilini diğer programlama dilleri ile kıyaslamak adil ve mantıklı bir karşılaştırma oluyor.

Şimdi her durumda bu iki dili ele alalım;

Yukarıda yazdıklarımı göz önünde bulundurarak kıyasladığım kıstaslardan bahsedeyim size. JavaScript için Node.js(V8), Payton için ise CPython implementasyonlarını ele alıyorum en yüksek market kapsayıcılığına sahip oldukları için. (PyPy JIT yorumlayıcısı ilginizi çekebilir.) Bunun yanında kıyaslayacağım uygulama turu CPU bound olacak. (I/O bound uygulamalar için Node.js'in first-class non-blocking I/O desteği ele alınınca Python ile kıyaslamaya gerek kalmıyor zaten :D)

Node.js (V8) özünde JIT compilation yaptığı için Python'dan çok daha hızlı, karşılaştıracak bir şeyi yok. Python'un sahip olduğu bytecode yorumlayıcısı yapısı gereği V8'den çok daha yavaş. Bahsettiğiniz "çoklu thread" olayı için ise size kotu bir haberim var: Python'un sahip olduğu GIL (Global Interpreter Lock).

"In CPython, the global interpreter lock, or GIL, is a mutex that protects access to Python objects, preventing multiple threads from executing Python bytecodes at once."

Python bu özelliği(?) ile birden fazla CPU çekirdeğinin kullanımına engel oluyor, dolayısı ile daha performanslı olacak düşüncesi ile yazacağınız multi-threaded kod aslında herhangi bir şekilde daha hızlı olmadığı gibi eklediği overhead yüzünden programınızı yavaşlatıyor. Bu gerçeklik size, haklı bir şekilde, threading modülünün varlığının gerekçesini sorgulatabilir, örnek vermenin gereğini görmüyorum ama kullanımının geçerliği olduğu yerlerin olduğundan emin olabilirsiniz.

Aşağıdaki kodu ele alalım:

Python:
# coding: utf-8

from time import time
from math import factorial as f
from multiprocessing.pool import ThreadPool

def threaded():
    t0 = time()
    with ThreadPool(10) as pool:
        pool.map(f, range(5000))
    return time() - t0

def not_threaded():
    t0 = time()
    for n in range(5000):
        f(n)
    return time() - t0

if __name__ == '__main__':
    print(f'threaded: {threaded()}\nnot threaded: {not_threaded()}')

Kendi makinemde çalıştırınca aldığım sonuçlar:
Kod:
main::~ python t.py
threaded: 0.8092238903045654
not threaded: 0.7503993511199951
main::~ python --version
Python 3.10.5

Görüldüğü üzere, threading ile çalışan kod Python'un single core/single threaded çalışan versiyonundan bile yavaş çalışıyor. Bununla palavranızı/saçmalamış olduğunuz durumu bir sonuca bağladık.

Cehalet başka bir şey.
 
Herhangi bir şekilde teknik anlamda bir açıklama yapmadan birkaç şeye değinmek istiyorum. Sizin gibi yazdıklarından eminmiş gibi davranıp karşı tarafa hakaretimsi cevaplar veren birisi kendisini küçük düşürülmeye itmekten öteye geçemeyeceği bir yolda yürüyor. Bu tarz yapıcı olmayan/hakaret içeren geri dönüşler, genel olarak aşağılık kompleksi tarafından güdülen, kendisini başka insanlardan çirkeflik yoluyla yüceltme çabasında olan insanların davranış biçimi.



Olayı teknik anlamda ele almak istersek, benim de hızlı cevap için atladığım kısa bir iki şeyden bahsedeyim size. Bir dilin başka bir dilden daha "hızlı" oluşu direkt olarak cevap verilebilecek bir şey değil, "hızlı" derken önemli olan hız hangisi? Hangi tür uygulamalarda hız kıyaslıyoruz? Eldeki uygulama CPU bound mu yoksa I/O bound mu? Bu ve benzeri sorulara cevap verdikten sonra bir programlama dilini diğer programlama dilleri ile kıyaslamak adil ve mantıklı bir karşılaştırma oluyor.

Şimdi her durumda bu iki dili ele alalım;

Yukarıda yazdıklarımı göz önünde bulundurarak kıyasladığım kıstaslardan bahsedeyim size. JavaScript için Node.js(V8), Payton için ise CPython implementasyonlarını ele alıyorum en yüksek market kapsayıcılığına sahip oldukları için. (PyPy JIT yorumlayıcısı ilginizi çekebilir.) Bunun yanında kıyaslayacağım uygulama turu CPU bound olacak. (I/O bound uygulamalar için Node.js'in first-class non-blocking I/O desteği ele alınınca Python ile kıyaslamaya gerek kalmıyor zaten :D)

Node.js (V8) özünde JIT compilation yaptığı için Python'dan çok daha hızlı, karşılaştıracak bir şeyi yok. Python'un sahip olduğu bytecode yorumlayıcısı yapısı gereği V8'den çok daha yavaş. Bahsettiğiniz "çoklu thread" olayı için ise size kotu bir haberim var: Python'un sahip olduğu GIL (Global Interpreter Lock).

"In CPython, the global interpreter lock, or GIL, is a mutex that protects access to Python objects, preventing multiple threads from executing Python bytecodes at once."

Python bu özelliği(?) ile birden fazla CPU çekirdeğinin kullanımına engel oluyor, dolayısı ile daha performanslı olacak düşüncesi ile yazacağınız multi-threaded kod aslında herhangi bir şekilde daha hızlı olmadığı gibi eklediği overhead yüzünden programınızı yavaşlatıyor. Bu gerçeklik size, haklı bir şekilde, threading modülünün varlığının gerekçesini sorgulatabilir, örnek vermenin gereğini görmüyorum ama kullanımının geçerliği olduğu yerlerin olduğundan emin olabilirsiniz.

Aşağıdaki kodu ele alalım:

Python:
# coding: utf-8

from time import time
from math import factorial as f
from multiprocessing.pool import ThreadPool

def threaded():
    t0 = time()
    with ThreadPool(10) as pool:
        pool.map(f, range(5000))
    return time() - t0

def not_threaded():
    t0 = time()
    for n in range(5000):
        f(n)
    return time() - t0

if __name__ == '__main__':
    print(f'threaded: {threaded()}\nnot threaded: {not_threaded()}')

Kendi makinemde çalıştırınca aldığım sonuçlar:
Kod:
main::~ python t.py
threaded: 0.8092238903045654
not threaded: 0.7503993511199951
main::~ python --version
Python 3.10.5

Görüldüğü üzere, threading ile çalışan kod Python'un single core/single threaded çalışan versiyonundan bile yavaş çalışıyor. Bununla palavranızı/saçmalamış olduğunuz durumu bir sonuca bağladık.

Cehalet başka bir şey.
Öncelikle değil Python’da herhangi bir threaded dilde multithread ve single thread arasındaki farkı görmek için yazılacak en saçma senaryonun kodunu yazmışsınız. Bunu yazmak için de saatlerdir çaba harcıyorsunuz. Ayrıca ortada herhangi bir Javascript testi göremem de orada istediğiniz sonucu elde edemedeğiniz anlamına geliyor.


Buradaki test senaryosu gayet uygun. Ayrıca Python’da CPU’da çoklu çekirdek kullanılmasının engellenmesi tamamen zırvana. Django ile yazılmış Rest API’lerimizi barındıran AWS EC2 instanceların tamamı intense bir sorgu attığımda %80’den fazla utilize ediyor CPU’yu 😀. Araştırma yapacaksanız da düzgün araştırma yapmanızı öneririm. Aşağılık kompleksinizi de kendinize bırakıyorum. Cehaletinizle başarılar diliyorum hayatınızda :).
 
Öncelikle değil Python’da herhangi bir threaded dilde multithread ve single thread arasındaki farkı görmek için yazılacak en saçma senaryonun kodunu yazmışsınız. Bunu yazmak için de saatlerdir çaba harcıyorsunuz. Ayrıca ortada herhangi bir Javascript testi göremem de orada istediğiniz sonucu elde edemedeğiniz anlamına geliyor.


Buradaki test senaryosu gayet uygun. Ayrıca Python’da CPU’da çoklu çekirdek kullanılmasının engellenmesi tamamen zırvana. Django ile yazılmış Rest API’lerimizi barındıran AWS EC2 instanceların tamamı intense bir sorgu attığımda %80’den fazla utilize ediyor CPU’yu 😀. Araştırma yapacaksanız da düzgün araştırma yapmanızı öneririm. Aşağılık kompleksinizi de kendinize bırakıyorum. Cehaletinizle başarılar diliyorum hayatınızda :).
Olayı anormalmiş gibi göstermek adına uzun bir suredir cevap yazdığımı dikte etmeniz de ayrı bir çirkeflik, ayni zamanda gerçeklikten uzak bir sanrı resmen.
Yazdığım ikinci paragrafta da bahsettiğim gibi özel olarak CPU bound bir uygulamayı ele aldım, Node.js'in varoluş nedeninin I/O bound uygulamalar olduğunu gerekçe göstererek.
Ayni şekilde JavaScript için benzeri bir testi yazmamış olmamın sebebini de açık bir şekilde dile getirdim: V8 JIT (Just In Time) compilation yapıyor. (C)Python bununla yarışamayacak bir bytecode yorumlayıcısına sahip, dilerseniz internet üzerinden herhangi bir benchmark'i inceleyebilirsiniz.
Bahsettiğiniz Rest API uygulamasına gelince, I/O bound bir uygulamadan bahsediyor olmanın yanında Node.js'in single-thread oluşunu yanlış anlamış olduğunuzu açık ediyorsunuz.
"The NodeJs event loop operates on a single thread yes, but the async blocking operations are delegated to separate worker threads. These threads notify the main thread when they are done processing."
Ayni zamanda şunu da dile getireyim, Python'da birden fazla CPU utilize edilecek programlar yazılamaz demedim hiçbir zaman. Elde olan threading modülü veya herhangi bir async uygulaması GIL engeline takılmak zorunda, o da Python'da herhangi bir zamanda sadece tek thread'in çalışabilir olması sınırlamasını getiriyor.
Multiprocessing diğer bir yandan, diğer CPU çekirdeklerinde yeni bir CPython instance'i oluşturuyor ve kodunuzu bu şekilde birden çok CPU'da çalıştırıyor. Anlamanız gereken önemli bir noktaya dikkat çekmek istiyorum, her bir CPU'da bir Python interpreteri demek anormal ölçülerde resource kullanımı ve overhead anlamına geliyor. (bu process based parallelism olarak geçtiği için bir şekilde IPC (inter-process comm) yapmaniz gerekiyor, o da ayrı bir overhead) Elimizde olanın en iyisi bu deyip ortaya çıkarılmış bir şey multiprocessing.

Eğer ki, nasıl olur da kullandığım Python web-framework'u birden fazla core kullanabiliyor derseniz, cevabi basit: web frameworkler ve web serverlar birbirinden farklı şeyler. Büyük ihtimalle bir production makinesinde Nginx veya Apache2 gibi web serverlar kullanıyorsunuz ve multi-core olayı için bilmeden vanilla Python'a credit veriyorsunuz.
Biliyorum diye düşündüğünüz şeyler üzerinde oturup ciddi bir şekilde tekrar (belki de ilk defa) çalışmanız gerekiyor gibi gözüküyor.
 
Son düzenleme:
Olayı anormalmiş gibi göstermek adına uzun bir suredir cevap yazdığımı dikte etmeniz de ayrı bir çirkeflik, ayni zamanda gerçeklikten uzak bir sanrı resmen.
Yazdığım ikinci paragrafta da bahsettiğim gibi özel olarak CPU bound bir uygulamayı ele aldım, Node.js'in varoluş nedeninin I/O bound uygulamalar olduğunu gerekçe göstererek.
Ayni şekilde JavaScript için benzeri bir testi yazmamış olmamın sebebini de açık bir şekilde dile getirdim: V8 JIT (Just In Time) compilation yapıyor. (C)Python bununla yarışamayacak bir bytecode yorumlayıcısına sahip, dilerseniz internet üzerinden herhangi bir benchmark'i inceleyebilirsiniz.
Bahsettiğiniz Rest API uygulamasına gelince, I/O bound bir uygulamadan bahsediyor olmanın yanında Node.js'in single-thread oluşunu yanlış anlamış olduğunuzu açık ediyorsunuz.
"The NodeJs event loop operates on a single thread yes, but the async blocking operations are delegated to separate worker threads. These threads notify the main thread when they are done processing."
Ayni zamanda şunu da dile getireyim, Python'da birden fazla CPU utilize edilecek programlar yazılamaz demedim hiçbir zaman. Elde olan threading modülü veya herhangi bir async uygulaması GIL engeline takılmak zorunda, o da Python'da herhangi bir zamanda sadece tek thread'in çalışabilir olması sınırlamasını getiriyor.
Multiprocessing diğer bir yandan, diğer CPU çekirdeklerinde yeni bir CPython instance'i oluşturuyor ve kodunuzu bu şekilde birden çok CPU'da çalıştırıyor. Anlamanız gereken önemli bir noktaya dikkat çekmek istiyorum, her bir CPU'da bir Python interpreteri demek anormal ölçülerde resource kullanımı ve overhead anlamına geliyor. (bu process based parallelism olarak geçtiği için bir şekilde IPC (inter-process comm) yapmaniz gerekiyor, o da ayrı bir overhead) Elimizde olanın en iyisi bu deyip ortaya çıkarılmış bir şey multiprocessing.

Eğer ki, nasıl olur da kullandığım Python web-framework'u birden fazla core kullanabiliyor derseniz, cevabi basit: web frameworkler ve web serverlar birbirinden farklı şeyler. Büyük ihtimalle bir production makinesinde Nginx veya Apache2 gibi web serverlar kullanıyorsunuz ve multi-core olayı için bilmeden vanilla Python'a credit veriyorsunuz.
Biliyorum diye düşündüğünüz şeyler üzerinde oturup ciddi bir şekilde tekrar (belki de ilk defa) çalışmanız gerekiyor gibi gözüküyor.
Nohup ile kodu çalıştırıyoruz sadece :D ?
 
Yazdığın şey tamamen yanlış. JavaScript Single-threaded bir dil. Python ise multithread destekliyor. 1-10 oranı yazdığının tam tersi olmalıydı.
JS Python'dan daha hızlı demiyorum ama bahsettiğin kıyaslama çok saçma olmuş. Single-threaded olması hızı azaltan veya dezavantajlı bir durum değil.

Aksine multi-threaded senaryolardaki kod yazma karmaşıklığını ve problemlerini kaldırıyor.
Örneğin deadlock oluşması.

Event Loop, Callback queue, ve WebAPI yardımı ile asenkron kodları ana kod memory heap'i dışarısında çalıştırıyor.

1656709196296.png


Yani asenkron bir kod parçası Memory Heap'den çıkarak Callback Queye'ye alınıyor ve kodumuzdan bağımsız işleme alınıyor.

Özet olarak bu yapı sayesinde de multi-threaded senaryolara gerek kalmıyor.

Konuyla ilgilenenler bu videoyu izleyebilir. Konuyu çok güzel anlatıyor.

Bu içeriği görüntülemek için üçüncü taraf çerezlerini yerleştirmek için izninize ihtiyacımız olacak.
Daha detaylı bilgi için, çerezler sayfamıza bakınız.
 

Technopat Haberler

Geri
Yukarı