Son kullanma tarihi geçmiş, bayatlamış bir tarayıcı kullanıyorsanız, Mercedes kullanmak yerine tosbağaya binmek gibi... Web sitelerini düzgün görüntüleyemiyorsanız eh, bi' zahmet tarayıcınızı güncelleyiniz. Modern Web standartlarını karşılayan bir tarayıcı alternatifine göz atın.
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.
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 )
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()}')
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.
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 )
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()}')
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.
Ö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.
In below code if I comment 'line 6' and uncomment 'line 3,4,5'. Code runs in main thread and time taken is 17 sec. Now if I uncomment 'line 6' and comment 'line 3,4,5'. And uncomment 'line 1' and c...
stackoverflow.com
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.
In below code if I comment 'line 6' and uncomment 'line 3,4,5'. Code runs in main thread and time taken is 17 sec. Now if I uncomment 'line 6' and comment 'line 3,4,5'. And uncomment 'line 1' and c...
stackoverflow.com
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.
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.