Python, C ++ 'dan daha hızlı ve hafif mi? [kapalı]


92

Her zaman Python'un avantajlarının kod okunabilirliği ve geliştirme hızı olduğunu düşünmüşümdür, ancak zaman ve bellek kullanımı C ++ 'daki kadar iyi değildi.

Bu istatistikler beni gerçekten çok etkiledi.

Deneyiminiz Python ile C ++ zamanı ve bellek kullanımı hakkında size ne anlatıyor?


18
Dolayısıyla, Pyhton bu vakaların çoğu için daha yavaştır ve daha fazla RAM kullanır, ancak kaynak daha küçüktür. Sorun tam olarak nedir?
nuriaion

2
Sanırım sonuçları yanlış yorumladım.
Alex

6
Gerçekten ilginç olan, C ++ testlerinin C olanlardan hala 'daha iyi' olmasıdır!
gbjbaanb

9
@gbjbaanb: Beni şaşırtmadı. C ++, potansiyel olarak daha hızlı kodlamayı mümkün kılan birçok özellik ekledi. Ne yaptığınızı biliyorsanız, C ++ gülünç derecede verimli olabilir, C'den çok daha fazla (Elbette, C ++ ayrıca performansa zarar veren bazı özellikler içerir, ancak bunları kullanmak zorunda değilsiniz). Ancak "C'nin C ++ 'dan daha hızlı olduğu" genel kanı yanlıştır. (ve soru ilk etapta pek anlamlı değil)
jalf

1
Bağlantı
kesildi

Yanıtlar:


242

Sanırım bu istatistikleri yanlış okuyorsunuz. Python'un C ++ 'dan yaklaşık 400 kat daha yavaş olduğunu ve tek bir durum haricinde, Python'un daha çok bir bellek domuzu olduğunu gösteriyorlar. Kaynak boyutuna gelince, Python kesinlikle kazanır.

Python ile olan deneyimlerim, herhangi bir ciddi sayı hesaplaması yaparken Python'un C ++ 'dan 10 ila 100 kat daha yavaş olduğu aynı kesin eğilimi gösteriyor. Bunun birçok nedeni vardır, en önemlileri: a) Python yorumlanırken C ++ derlenir; b) Python'un ilkelleri yoktur, yerleşik türler (int, float, vb.) dahil her şey nesnelerdir; c) bir Python listesi farklı türdeki nesneleri tutabilir, bu nedenle her bir girişin türü hakkında ek veri depolaması gerekir. Bunların tümü, hem çalışma süresini hem de bellek tüketimini ciddi şekilde engeller.

Bu Python'u görmezden gelmek için bir sebep değil. 100 zaman yavaşlık faktöründe bile birçok yazılım çok fazla zaman veya bellek gerektirmez. Geliştirme maliyeti, Python'un basit ve özlü stille kazandığı yerdir. Geliştirme maliyetindeki bu iyileştirme, genellikle ek işlemci ve bellek kaynaklarının maliyetinden daha ağır basar. Olmazsa, o zaman C ++ kazanır.


111
Ayrıca, Python'un ciddi sayı hesaplaması için yavaş olduğunu söyleyenler, Numpy ve Scipy modüllerini kullanmamışlardır. Python bugünlerde bilimsel hesaplamada gerçekten yükseliyor. Tabii ki, hız C ile yazılmış modülleri veya Fortran'da yazılmış kütüphaneleri kullanmaktan geliyor, ancak bence bir betik dilinin güzelliği bu.
Justin Peel

3
Söylediklerinizi ve bunu kanıtlamak için bir bağlantı olduğundan eminim
ucefkh

2
Bununla ilgili olarak: c) bir Python listesi farklı türdeki nesneleri tutabilir, bu nedenle her girişin türü hakkında ek veri depolaması gerekir. Python listesi gerçekten nesnelere işaret edenlerin listesidir. Python'da, türünü bilen değerdir, değişken ise yalnızca "genel değer nesnesine" bir göstericidir (bu nedenle sayılar bile değişmezdir). Bu nedenle listeler, içerik türlerini depolamıyor - sadece işaretçiler. Yine de bellek ek yükü konusunda haklısınız - python, her türden değerler için türü ve diğer bağlamı saklamak zorunda.
Alex

cpython hakkında konuşursanız..o zaman evet, ancak pypy çoğu durumda çok hızlıdır (java ile karşılaştırılabilir, sanırım 1/3 java hızı), python alt kümeleri neredeyse c ++ kadar hızlıdır (shedskin'e bakın)
Quonux

1
@JustinPeel bunun doğru olup olmadığını sorguluyorum. geniş yararlanarak bile numpyve scipybüyük bir pythonkod tabanı daha yavaş bir şeyler yapma, saf Python kod çok olması muhtemeldir C++. bir python betiği C++, Ckodunun yüzdesi gittikçe bir betiğin hızına yaklaşır, 100bu noktada artık bir python betiği değildir. python elbette yükseliyor, ancak onun kadar hızlı olduğu için değil C++- çünkü kullanımı daha kolay.
dbliss

129

Çatışmadaki en yavaş (> 100x) Python kullanımları, yüksek GFlop / s sayısı gerektiren bilimsel işlemlerdir. Zaten bunlar için python KULLANMAMALISINIZ. Python kullanmanın doğru yolu, bu hesaplamaları yapan bir modülü içe aktarmak ve ardından ailenizle rahatlatıcı bir öğleden sonra geçirmektir. Bu pitonik yol :)


3
Günümüzde birkaç Python-C ++ derleyicisi vardır , bu nedenle Python bazı durumlarda C ++ kadar hızlı olabilir.
Anderson Yeşil

26

Deneyimlerim kıyaslamalarla aynı. Python yavaş olabilir ve daha fazla bellek kullanır. Çok, çok daha az kod yazıyorum ve ilk seferinde çok daha az hata ayıklama ile çalışıyor. Benim için belleği yönettiği için, herhangi bir bellek yönetimi yapmam gerekmiyor, bu da çekirdek sızıntılarını takip etmek için saatler kazandırıyor.

Sorunuz nedir?


Ben sadece kıyaslamaların sonuçları kafamı karıştırdı. Onları yanlış anladığım ortaya çıktı.
Alex

14

Kaynak boyutu gerçekten ölçmek için mantıklı bir şey değil. Örneğin, aşağıdaki kabuk betiği:

cat foobar

Python veya C ++ eşdeğerlerinden çok daha kısadır.


36
Ve daha uzun Python veya C ++ sürümlerini korumak çok daha kolay. Kaynak kod boyutunun önemli olduğunu ve bazı basit görevler için kısa kabuk komut dosyalarının iyi olduğunu savunuyorum.
S.Lott

Ayrıca kaynak kod boyutunun çok önemli olduğuna ve bazı görevler için Bash'in iş için doğru araç olduğuna inanıyorum. Burada basit bir bash betiğini python ile karşılaştıran güzel bir örnek görün: innolitics.com/articles/programming-languages/… (biraz aşağı kaydırmanız gerekir). Sanırım biraz daha sofistike bir örnek cat footer.
jdg

7

Ayrıca: Psyco ve C ++ .

Bu yine de kötü bir karşılaştırma, çünkü kimse sayı çatlaklarını yapmaz, zaten saf Python'da odaklanma eğilimindedir. Daha iyisi, programınızın gözle görülür şekilde daha yavaş olup olmayacağı konusunda bir fikir edinmek için gerçekçi uygulamaların veya C ++ ile NumPy'nin performansını karşılaştırmaktır.


2
başka bir deyişle - numbercrunchy şeyler çok daha yavaş olduğundan C ++ 'da yazın ve Python'dan arayın :-)
igouy

1
Daha hızlı hale getirmek için python'da bir kitaplık kullanacaksanız, o zaman c ++ 'da bir sayı hesaplama kitaplığı da kullanabilirsiniz. Bu şekilde, bir grup kod yazmak zorunda kalmadan c ++ esnekliğini koruyabilirsiniz :)
SuperSim135

Bu, tanrı düzeyinde anlamsız bir nekro. OP kelimenin tam anlamıyla Python'u okunabilirlik ve rahatlık için tercih ettiğini belirtir, neden birileri daha az sevdiği bir dili doğrudan kullansın ki, kütüphane yazarlarının kendisi için o dillere bakmasını sağlayarak performans avantajlarının çoğunu elde edebilir? Kitaplıkları kullanmanın amacı, kendi başlarına daha iyi yaptıkları işleri yapmak zorunda kalmamaktır, bir kitaplığın yerel bir bağlama olması bir optimizasyon / uygulama ayrıntısıdır.
millimoose

6

Buradaki sorun, iki farklı sorunu çözen iki farklı dile sahip olmanızdır ... C ++ ile assembler'ı karşılaştırmak gibidir.

Python, hızlı uygulama geliştirme ve performansın minimum endişe kaynağı olduğu zamanlar içindir.

C ++, hızlı uygulama geliştirme için değildir ve düşük seviyeli programlama için C'den bir hız mirasını devralır.


3

Her zamanki gibi yönetilen ve kullanımı kolay programlama diliyle aynı problem - yavaştırlar (ve bazen hafızayı tüketirler).

Bunlar işlemden ziyade kontrol edilecek dillerdir. Görüntüleri dönüştürmek için uygulama yazmam ve Python'u da kullanmak zorunda kalsaydım, tüm işlemler C ++ dilinde yazılabilir ve bağlantılarla Python'a bağlanabilirken, arayüz ve işlem kontrolü kesinlikle Python olurdu.


Bu kitaplıklar Python, C veya Java için zaten yazılmıştır, öyleyse neden bunları birbirine yapıştırmak için dinamik bir dil kullanmayasınız?
aoeu256

2

Sanırım bu istatistikler Python'un çok daha yavaş olduğunu ve bu kıyaslamalar için daha fazla bellek kullandığını gösteriyor - bunları doğru şekilde okuduğunuzdan emin misiniz?

Çoğunlukla Python'da ağ ve dosya sistemine bağlı programlar yazmakla ilgili olan deneyimime göre, Python önemli olan hiçbir şekilde önemli ölçüde yavaş değildir. Bu tür işler için faydaları maliyetlerinden ağır basar.


Aslında. Performans bir sorun olduğunda, python'un iyi olduğu şey, yüksek performanslı harici modülleri birbirine bağlamak veya sistemi prototiplemek ve ardından darboğazların (genellikle bir iç döngüde derin olan) bir C modülü olarak yeniden yazılmasına izin
vermektir
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.