derlemeden önce Python koduyla Prototip

oy
19

Bir süre bir zirve uydurma kütüphane yazmak evirip edilmiştir. Oldukça iyi Python biliyorum ve başlamak Python her şeyi uygulayan planlıyorum ama sonunda bir derlenen dilin bazı temel rutinleri yeniden düzenlemesini olabileceğini öngörüyoruz.

IIRC, Python'un orijinal yetki devirleriyle biri aynı doğru değildir şüpheli C veya Fortran demek oysa ancak Python, fonksiyonlar, funktorlar, nesneler işlevleri ve yöntemlere iletilmesine izin verilir oldukça liberaldir, bir prototip dil ​​olarak oldu.

Ben derlenmiş dile arabirimi kullanmak zorunda olacak öngörüyoruz işlevleri / sınıfları tasarlama hakkında ne bilmeliyim? Ve bu potansiyel sorunların ne kadar böyle ctypes, Tuğg gibi kütüphaneler tarafından ele alınır yudum , Boost.Python , Cython veya Python SIP ?

Bu özel kullanım durumunda, (uygun bir kütüphane) için Kullanıcıların derlenir kod uyan kütüphanesi tarafından geçirilen yorumlanmalıdır Python fonksiyonları gibi matematiksel fonksiyonlar (Guassian, Lorentz vs.) tanımlamak için izin düşünün. Geçme ve diziler dönen de çok önemlidir.

Oluştur 19/08/2008 saat 11:32
kaynak kullanıcı
Diğer dillerde...                            


7 cevaplar

oy
1

Tecrübelerime göre, Python kodundan C koduna çağırmak için iki kolay yolu vardır. daha rahatsız edici ve / veya ayrıntılı bunların tümü diğer yaklaşımlar vardır.

İlk ve en kolay ayrı paylaşılan kitaplık olarak C kodu bir demet derlemek ve sonra ctypes kullanarak Kütüphanede işlevleri çağırmak etmektir. Ne yazık ki, temel veri türleri dışında başka bir şey geçirmeden olmayan önemsiz olduğunu.

İkinci en kolay yolu C bir Python modülü yazmak ve sonra bu modülde fonksiyonlarını aramak. Herhangi çemberler üzerinden atlamak zorunda kalmadan bu C fonksiyonları istediğiniz bir şey geçebilir. Burada açıklandığı gibi Ve bu, bu C fonksiyonundan Python işlevleri veya yöntemleri çağırmak kolaydır: https://docs.python.org/extending/extending.html#calling-python-functions-from-c

Ben akıllı bir yorum sunmak için SWIG ile yeterli deneyime sahip değildir. o ctypes yoluyla C işlevlerine geçiş özel Python nesne gibi şeyler yapmak ya da C yeni Python sınıfları tanımlamak mümkündür ederken, bunlar can sıkıcı ve ayrıntılı ve ben yukarıda açıklanan iki yaklaşımlardan birini alarak öneririz.

Cevap 19/08/2008 saat 12:52
kaynak kullanıcı

oy
6

Derlenmiş koduna bir geçebilmesi için planı için en iyi yolu, basit fonksiyonların bir modül olarak performans duyarlı kısımları yazmak için işlevsel bir tarzda kabul (durum bilgisi ve herhangi bir yan etkiye) ve temel veri türleri döndürür.

Bu nihai derlenmiş koda Python prototip kodundan bire bir eşleştirme temin edecek ve kullanmak izin verir ctypes kolayca ve baş ağrısı bir sürü kaçının.

uydurma zirve için, neredeyse kesinlikle şeyleri biraz karmaşık hale getirecektir diziler, kullanmak gerekir, ama yine ctypes ile çok yapılabilir edeceğiz.

Gerçekten daha karmaşık veri yapılarını kullanabilir veya geçirilen argümanları değiştirmek istiyorsanız, yudum veya Python'ın standart C-uzatma arayüzü istediğini yapalım, ama güçlük bazı miktarda olacaktır.

Ne yaptığını için, ayrıca kontrol etmek isteyebilirsiniz numpy Eğer sağlamasının yanı sıra, C itmek isteyeyim çalışmalar yapmak olabilir ileri geri Python ve C arasında veri taşımak bazı ek yardım .

Cevap 20/08/2008 saat 00:45
kaynak kullanıcı

oy
10

SWIG veya SIP kullanmadıysanız, ama birlikte Python sarmalayıcılarını yazma bulmak boost.python çok güçlü ve kullanımı nispeten kolay olması.

Ben senin gereksinimleri C / C ++ ve piton arasında türlerini geçirilmesi için ne net değilim, ama sen, ya bir jenerik kullanarak piton bir C ++ türü açığa biri tarafından kolayca yapabilir :: piton :: nesne destek için argüman senin C ++ API. Ayrıca otomatik C ++ türleri ve tersi piton türlerini dönüştürmek için dönüştürücüler kaydedebilirsiniz.

Eğer kullanım boost.python planlıyorsanız, öğretici başlamak için iyi bir yerdir.

Neye ihtiyacın biraz benzer bir şey uyguladık. Bir piton fonksiyonu ve argümanlar olarak bir görüntüyü kabul eder ve görüntüdeki her piksel için piton fonksiyonunu uygulayan bir C ++ işlevi var.

Image* unary(boost::python::object op, Image& im)
{
    Image* out = new Image(im.width(), im.height(), im.channels());
    for(unsigned int i=0; i<im.size(); i++)
    {
        (*out)[i] == extract<float>(op(im[i]));
    }
    return out;
}

Bu durumda, Görüntü C ++ piton (şamandıra pikselli bir görüntü) maruz nesnedir ve op bir piton tanımlı fonksiyonu (veya gerçekten bir __call__ özniteliği ile herhangi piton nesne) 'dir. (Varsayarak birli ayrıca Resim ve yük işlevini içeren denilen görüntüde yer almaktadır) aşağıdaki gibi Daha sonra bu işlevi kullanabilirsiniz:

import image
im = image.load('somefile.tiff')
double_im = image.unary(lambda x: 2.0*x, im)

Boost diziler kullanıyorsanız gelince, ben şahsen bu yapmadıysanız, ama kullanılabilir boost kullanılarak python için diziler ortaya çıkarmak için işlevsellik biliyorum - bu yararlı olabilir.

Cevap 26/08/2008 saat 14:58
kaynak kullanıcı

oy
4

f2py (bir kısmının numpy) C / Fortran sayıda zorlayıcı kodu sarılması için daha basit bir yudum için alternatif ve boost.python olup.

Cevap 29/09/2008 saat 21:30
kaynak kullanıcı

oy
0

Ben aynı doğru değildir şüpheli C veya Fortran demek oysa Python, fonksiyonlar, funktorlar, nesneler işlevleri ve yöntemlere iletilmesine izin verilir oldukça liberaldir.

C size bir işleve argüman olarak bir işlev geçemez ancak bir işlev gibi iyi bir işlev işaretçisi geçebilir.

Sana C ve Python kodu entegre çalışırken yardımcı olacağını ne kadar bilmiyorum ama ben sadece bir yanlış anlamayı açıklığa kavuşturmak istedim.

Cevap 29/09/2008 saat 21:52
kaynak kullanıcı

oy
0

Yukarıdaki araçlara ek olarak, kullanarak tavsiye edebilir Pyrex'tir ya da (Python genişletme modülleri oluşturmak için) Psyco (Python için JIT derleyicisi gibi).

Cevap 16/05/2009 saat 14:08
kaynak kullanıcı

oy
35

Sonunda gerçekten bir değer cevabı :) koymak bir soru.

İşimde (optik ölçüm teknikleri doktora) f2py, boost.python, yudum, Cython ve Pyrex'tir araştırdık. Bazı ve payreksten boost.python ve çok Cython, yoğun yudum kullandı. Ben de ctypes kullandı. Bu benim arıza:

Yasal Uyarı : Bu benim kişisel bir deneyimdir. Ben bu projelerin hiçbiriyle ilgili değilim.

yudum: c ++ ile iyi oynamıyor. C kodu var ve piton arabirim istiyorsanız O, ancak ad bağlama safhasında problemleri bozma gereken linux ve Mac OS X'te benim için büyük bir baş ağrısı oldu, iyi bir çözümdür. Benim ihtiyaçları için GTS sarılmış ve temelde ben bağlanmak olabilecek bir C paylaşılan kitaplık yazmak gerekiyordu. Bunu tavsiye etmem.

Ctypes: Ben ctypes kullanarak bir libdc1394 (IEEE Kamera kütüphanesi) sarıcı yazdı ve bir çok straigtforward deneyim oldu. Sen kod bulabilirsiniz https://launchpad.net/pydc1394 . Bu çok iş piton koduna başlıklarını dönüştürmek için, ama sonra her şey güvenilir bir şekilde çalışır. Harici bir kütüphane arayüz istiyorsanız bu iyi bir yoldur. Herkes hemen kodu kullanabilirsiniz böylece Ctypes, pitonun stdlib içerisindedir. Bu aynı zamanda hızlı bir şekilde python yeni lib ile uğraşmak için iyi bir yoldur. Ben harici kütüphaneleri için arayüz tavsiye edebilir.

Boost.Python : Çok keyifli. Eğer zaten, Python kullanmak bunun için gitmek istiyorum kendi C ++ kodu varsa. Şekilde piton sınıf yapılarına c ++ sınıf yapıları çevirmek çok kolaydır. Eğer python ihtiyaç ++ kod c varsa bunu tavsiye.

Pyrex / Cython: Kullanım Cython değil Pyrex. Dönemi. Cython daha gelişmiş ve kullanımı daha keyifli. Günümüzde ben yudum veya ctypes ile yapmak için kullanılan Cython ile her şeyi yapmak. Ayrıca çok yavaş çalışır piton kodunuz varsa en iyi yoldur. Süreç kesinlikle harika: Eğer Cython modüllere halinde piton modüllerini dönüştürmek hala piton (gerekli araçların değişiklik yok) gibi profil ve optimize bunları inşa etmek ve korumak. Daha sonra piton kodu ile karışık kadar (veya az) C kodu uygulayabilirsiniz. Bu kadar hızlı sonra C uygulamanın bütün bölümlerini yeniden yazmak zorunda gereğidir; Eğer sadece iç döngü yeniden.

Zamanlamaları : ctypes swig (290ns) tarafından daha sonra doğrudan boost.python (322ns) izledi yüksek çağrı yükü (~ 700ns), vardır. Cython en düşük çağrı yükü (124ns) ve çalıştığı zaman harcıyor iyi geribildirim vardır (Cprofile desteği!). Sayılar interaktif kabuğundan bir tamsayı döndüren bir önemsiz işlevini çağırarak benim kutusundan vardır; Modül ithalat havai nedenle zaman aşımına değil, sadece işlev çağrısı havai olduğunu. Bu nedenle en kolay ve en verimli profilleme ve Cython kullanarak hızlı piton kodunu elde etmektir.

Özet : senin sorun için, Cython kullanın;). Bu yıkık bazı insanlar için yararlı olacağını umuyoruz. Memnuniyetle kalan soruya cevap olacak.


Düzenleme : söylemeyi unutma: sayısal amaçlar Cython kullanmak (yani, numpy bağlantısı olan) için; (bunlar temelde bu amaçla Cython geliştirmek için) bunun için destek var. Yani bu karar için başka 1 olmalıdır.

Cevap 02/11/2009 saat 12:16
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more