Python programını C / C ++ koduna dönüştür? [kapalı]


160

bir Python programını C / C ++ 'ya dönüştürmek mümkün müdür?

Birkaç algoritma uygulamam gerekiyor ve performans boşluğunun, bunu C / C ++ ile yaparken yaşadığım tüm acıyı haklı çıkaracak kadar büyük olup olmadığından emin değilim (ki bu konuda iyi değilim). Basit bir algoritma yazmayı ve onu böyle dönüştürülmüş bir çözüme göre karşılaştırmayı düşündüm. Tek başına bu Python sürümünden önemli ölçüde daha hızlıysa, bunu C / C ++ ile yapmaktan başka seçeneğim kalmayacak.


35
Python, kıyaslamalarda kaybettiği kadarıyla, hesaplama Python'da birkaç saniye içinde biterse 50x veya 100x yavaşlamanın hala ihmal edilebilir olduğunu ve çok fazla G / Ç yaptığınızda veya korkunç bir algoritmaya sahip olduğunuzda bile doğru olmadığını unutmayın. "Python ne kadar yavaş?" Diye sormak yerine "Python yeterince hızlı mı?" diye sormalısınız. (ve en olası olarak, dürüst olmak gerekirse) - bu aynı zamanda kıyaslama yapmaktan veya burada sormaktan daha hızlıdır.

1
Python'da bir algoritma uygulamak oldukça hızlı ve basittir ... Bunu yapmanız ve ardından yeterince hızlı olup olmadığını kontrol etmeniz yeterlidir. Çoğu zaman , algoritmayı farklı veri yapıları (listeler yerine dikte / kümeler ...) veya farklı işlemler kullanarak çok daha hızlı çalışacak şekilde optimize edebilirsiniz . Her halükarda optimizasyon , algoritmanın ilk taslağını uyguladıktan ve onu karşılaştırdıktan / profilini çıkardıktan sonra yapılmalıdır .
Bakuriu

@delnan: Benim durumumda her şey hesaplama zamanıyla ilgili. C varyantının x saate daha az ihtiyacı varsa, o zaman algoritmaların daha uzun / tekrar çalışmasına izin vermek için bu zamanı yatırırdım. Ben sadece (kabaca) Python'un ne kadar yavaş olacağını bulmak istiyorum - eğer sadece birkaç saatse, kesinlikle rahat olmadığım bir dili kullanmam (kötü uygulamalarla ilgili sorunlara en iyi çözümleri mahvedebilirsiniz: P).
CrazyFlyingCloseline

@ delnan, Python'un muhtemelen birçok şey için yeterince hızlı olduğu konusunda haklı. Daha yavaş olduğunda bile geliştirme, bakım ve gelecekteki iyileştirme kolaylığı dikkate alınması gereken önemli faktörlerdir.
martineau

"x saat"? Bu ne kadar büyük? Bir uygulamayı karşılaştırdınız mı? Ölçüleriniz var mı? Uygulamanın profilini çıkardınız mı? Yoksa çözümü vaktinden önce optimize etmeye mi çalışıyorsunuz?
S.Lott

Yanıtlar:


122

Evet. Cython'a bakın . Sadece şunu yapar: Python'u hızlandırmalar için C'ye dönüştürür.


6
Elbette, bir dizi cdefbildirim eklemedikçe ve böylece statik yazmayı başlatmadığınız sürece (aksi takdirde sadece opak PyObject *şeyler yaparsınız), bu size hiçbir şey kazandırmaz . Ve hiçbir zaman düz C kadar hızlı olmayacak çünkü genellikle Python ile arayüz oluşturuyor (% 100 veya daha fazlası? Yalnızca Python ile hiç arayüz oluşturmayan düz sayısal kod için!). Ama bunun dışında, evet, size oldukça hızlı bir hız kazandırabilir.

8
@delnan: Aslında size bir şey kazandırır. Çoğu saf Python kodu derlendikten sonra daha hızlı olacaktır. Ama evet, cdefs ve statik yazımla gerçekten farklılıklar görmeye başlıyorsunuz. Ve Python'dan C kullandığınız her durumda Python ile arayüz elde edersiniz.
Lennart Regebro

140

C varyantının x saate daha az ihtiyacı varsa, o zaman algoritmaların daha uzun / tekrar çalışmasına izin vermek için bu zamanı yatırırdım.

"yatırım" burada doğru kelime değil.

  1. Python'da çalışan bir uygulama oluşturun. Bunu bir C versiyonunu bitirmeden çok önce bitireceksiniz.

  2. Python profil oluşturucuyla performansı ölçün. Bulduğunuz sorunları düzeltin. Bunu gerçekten doğru bir şekilde yapmak için veri yapılarını ve algoritmaları gerektiği gibi değiştirin. Bunu C'deki ilk sürümü bitirmeden çok önce bitireceksiniz.

  3. Hala çok yavaşsa, iyi tasarlanmış ve dikkatlice inşa edilmiş Python'u manuel olarak C'ye çevirin.

    Geriye dönük görüşün çalışma şekli nedeniyle, mevcut Python'dan ikinci sürümü yapmak (mevcut birim testleri ve mevcut profilleme verileriyle) yine de C kodunu sıfırdan yapmaya çalışmaktan daha hızlı olacaktır.

Bu alıntı önemlidir.

İlk Kez Teleskop Yapımcıları için Thompson Kuralı
Dört inçlik bir ayna ve ardından altı inçlik bir ayna yapmak, altı inçlik bir ayna yapmaktan daha hızlıdır.

Bill McKeenan
Wang Enstitüsü


18
Muazzam puan ne olursa olsun, bunun soruyu nasıl yanıtladığını anlamıyorum.
Audrius Meskauskas

29

Shed Skin "(sınırlı) bir Python-C ++ derleyicisidir".


3
+1 Shed Skin'in bir avantajı tür çıkarımıdır : program akışından değişken türlerini tahmin etmek mümkünse, dinamik tür denetiminden kaçınılır. Bu genellikle daha hızlı programları okumak ve derlemek gerçekten mümkün olan daha kısa C ++ koduna yol açar.
Kyss Tao

1
Orada da Python → 11l → C ++ transpiler da C ++ derleyici kısıtlı Python olduğunu, ancak döken Skin ile desteklenmeyen bazı Python özellikleri (örneğin iç içe işlevleri / kapanışları) destekler.
tav

18

Sadece rastladım buHacker haberlerinde yeni araca yeni .

Sayfalarından - "Nuitka, Python yorumlayıcısı için iyi bir alternatiftir ve CPython 2.6, 2.7, 3.2 ve 3.3'ün sunduğu her yapıyı derler. Python'u, aynı şekilde çalıştırmak için" libpython "kullanan bir C ++ programına çevirir. CPython çok uyumlu bir şekilde bunu yapıyor. "


Bu proje diğer benzer seçeneklerden çok daha olgun. .exeTamamen normal bir OSX Mach-O çalıştırılabilir olmasına rağmen, OSX üzerinde bir uzantı ile ikili oluşturması komik . Böyle görünüyor için iyi bir yedek olabilir pyinstaller, py2exe, py2appvb --recurse-***bayraklar olsa düzgün ayarlamak için önemlidir.
ccpizza

Nuitka harika, ancak oluşturulan C / C ++ kodu, CPython-C-kod uygulamasına bağlanan PyObject kullanıyor. Deyimsel C kodu üretmez.
Make42

8

Başka bir seçenek - yanında C ++ dönüştürmek döken Skin - olduğunu Pythran .

Micha Gorelick ve Ian Ozsvald'ın Yüksek Performanslı Python'dan alıntı yapacak olursak :

Pythran, Python'un kısmi içeren bir alt kümesi için Python-C ++ derleyicisidir. numpy destek . Biraz Numba ve Cython gibi davranır - bir işlevin argümanlarına açıklama eklersiniz ve ardından daha fazla tür ek açıklaması ve kod uzmanlığı ile görevi devralır. Vektörleştirme olanaklarından ve OpenMP tabanlı paralelleştirme olanaklarından yararlanır. Yalnızca Python 2.7 ile çalışır.

Pythran'ın çok ilginç bir özelliği, paralelleştirme fırsatlarını otomatik olarak tespit etmeye (örneğin, a kullanıyorsanız map) ve sizden fazladan çaba gerektirmeden bunu paralel koda dönüştürmeye çalışmasıdır. Paralel bölümler de belirtebilirsiniz.pragma omp > Yönergeleri ; bu açıdan Cython'un OpenMP desteğine çok benziyor.

Pythran perde arkasında hem normal Python hem de numpy kodunu alacak ve bunları agresif bir şekilde çok hızlı C ++ 'ya derlemeye çalışacak - Cython sonuçlarından bile daha hızlı.

Bu projenin genç olduğunu ve hatalarla karşılaşabileceğinizi unutmamalısınız; Ayrıca geliştirme ekibinin çok arkadaş canlısı olduğunu ve hataları birkaç saat içinde düzeltme eğiliminde olduğunu da unutmamalısınız.


1
Pythran, "0.9.5'e kadar (dahil), Python 3 ve Python 2.7'yi destekliyordu. Artık yalnızca Python 3'ü destekliyor."
Make42

7

Bunun daha eski bir konu olduğunu biliyorum ama yararlı olacağını düşündüğüm bilgileri vermek istedim.

Ben şahsen pip kullanarak kurulumu çok kolay olan PyPy kullanıyorum. Değişmeli olarak Python / PyPy yorumlayıcısını kullanıyorum, kodunuzu değiştirmenize gerek yok ve standart python yorumlayıcısından (Python 2x veya 3x) kabaca 40 kat daha hızlı olduğunu buldum. Kodumu yönetmek için pyCharm Community Edition kullanıyorum ve buna bayılıyorum.

Python'da kod yazmayı seviyorum çünkü göreve dilden daha fazla odaklanmanıza izin veriyor, ki bu benim için büyük bir artı. Ve daha hızlı olmasına ihtiyacınız varsa, her zaman Windows, Linux veya Mac için bir ikili dosyada derleyebilirsiniz (doğrudan değil, ancak diğer araçlarla mümkündür). Deneyimlerime göre, derleme sırasında PyPy'ye göre yaklaşık 3.5 kat hızlanma elde ediyorum, yani python'dan 140 kat daha hızlı. PyPy, Python 3x ve 2x kodu için kullanılabilir ve yine PyCharm gibi bir IDE kullanırsanız, örneğin PyPy, Cython ve Python arasında çok kolay bir şekilde değişim yapabilirsiniz (yine de biraz ilk öğrenme ve kurulum gerektirir).

Bazı insanlar bu konuda benimle tartışabilir, ancak PyPy'yi Cython'dan daha hızlı buluyorum. Ama ikisi de harika seçenekler.

Düzenleme: Derleme hakkında kısa bir not daha vermek istiyorum: derleme yaptığınızda ortaya çıkan ikili dosya, içine tüm bağımlılıkları oluşturduğu için python betiğinizden çok daha büyüktür, vb. Ama sonra birkaç farklı fayda elde edersiniz: hız !, artık uygulama, Python veya kitaplıklar olmadan herhangi bir makinede (tümü olmasa da, hangi işletim sistemi için derlediğinize bağlı olarak) çalışacaktır, ayrıca kodunuzu gizler ve teknik olarak 'üretime' hazır (bir dereceye kadar). Bazı derleyiciler ayrıca C kodu üretirler, bu kodu gerçekten bakmıyorum ya da işe yarayıp yaramadığını ya da anlamsız olduğunu görmedim. İyi şanslar.

Umarım yardımcı olur.


2
Bunun daha eski bir yorum olduğunu biliyorum ama teşekkürler!
kfrncs

Sorun değil, işe yaradığına sevindim.
jacktrader

PyPy yorumlamasından derlemek için hangi yazılımı kullanıyorsunuz?
Vasyl Vaskivskyi

Özellikle PyPy değil, sadece .py betikleri. Nuitka, "C / C ++ yürütülebilir dosyaları veya C / C ++ kaynak kodu" istiyorsanız ve yalnızca bir yürütülebilir dosya istiyorsanız (daha kolay) PyInstaller. Bir de py2exe var ama bununla daha az başarılı oldum, yine de işler düzeldiğinden eminim. PyInstaller ayrıca çapraz platformdur, sadece Windows çalıştırılabilirleri için değil (Linux ve Mac ile çalışır). Nuitka benzersizdir çünkü teoride daha fazla optimize edebileceğiniz kullanılabilir kaynak kodunu size geri veren tek "derleyici" olduğunu düşünüyorum. BbFreeze, cx_Freeze ve py2app gibi birkaç tane daha var ama onları denemedim. İyi şanslar!
jacktrader

1
Ayrıca PyPy'nin Cython'dan daha hızlı çalıştığını buldum. Bir testte PyPy'nin programın C ++ sürümü ile aynı hızda olduğunu buldum (ekleme sıralaması).
Nv7

5

Oldukça yeni bir çözüme dair bir cevabın eksik olduğunun farkındayım. Kodda Numpy kullanılıyorsa, Pythran'ı denemenizi tavsiye ederim:

http://pythran.readthedocs.io/

Pythran, denediğim işlevler için son derece iyi sonuçlar veriyor. Ortaya çıkan işlevler, Fortran kodu kadar hızlı yazılır (veya yalnızca biraz daha yavaştır) ve (oldukça optimize edilmiş) Cython çözümünden biraz daha hızlıdır.

Cython ile karşılaştırıldığında avantaj, Pythran'ı Numpy için optimize edilmiş Python işlevi üzerinde kullanmanız gerektiğidir, yani döngüleri genişletmeniz ve döngüdeki tüm değişkenler için türler eklemeniz gerekmez. Pythran, kodu analiz etmek için zaman ayırır, böylece işlemleri anlar numpy.ndarray.

Aynı zamanda, Numba'ya veya tam zamanında derlemeye dayalı diğer projelere kıyasla (benim bildiğim kadarıyla) döngüleri gerçekten verimli olmak için genişletmeniz gereken büyük bir avantajdır. Ve sonra döngüleri olan kod, yalnızca CPython ve Numpy kullanıldığında çok verimsiz hale gelir ...

Pythran'ın bir dezavantajı: sınıf yok! Ancak yalnızca gerçekten optimize edilmesi gereken işlevlerin derlenmesi gerektiğinden, bu çok sinir bozucu değil.

Başka bir nokta: Pythran, OpenMP paralelliğini iyi (ve çok kolay) destekliyor. Ama mpi4py'nin desteklendiğini sanmıyorum ...


4

http://code.google.com/p/py2c/ bir olasılık gibi görünüyor - ayrıca sitelerinde Cython, Shedskin ve RPython'dan bahsediyorlar ve Python kodunu C'den çok daha hızlı olan saf C / C ++ 'ya dönüştürdüklerini onaylıyorlar / C ++ Python API çağrılarıyla dolu. Not: Denemedim ama yapacağım ..


1
Görünüşe göre Py2C hala bitmemiş bir proje. Birkaç yıldır güncellenmedi, bu yüzden feshedilmiş olabilir.
Anderson Green
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.