„Python je velmi oblíbený jazyk hlavně díky jeho jednoduchosti, tedy díky tomu, že je interpretovaný.“
I interpretovaný jazyk může být komplikovaný, i kompilovaný jazyk může být jednoduchý.
„sám o sobě je Python rychlík oproti jiným interpretovanými jazyky“
Oproti kterým např.? Oproti kupř. Forthu je to podchlazený šnek. ;-)
Python je velmi oblíbený jazyk hlavně díky jeho jednoduchosti, tedy díky tomu, že je interpretovaný.
Nesmyslná věta, beru to jako omáčku, kdo zná Python, ví jaký a o čem je ;-)
Zkušenost je taková, že i sebevíce líné a interpretované či „polokompilované“ jazyky jsou dostatečně rychlé, samozřejmě s pílí pilovaným assemblerovým kódem nelze srovnávat. Co se týče web aplikací – PHP, Java, .NET (C#, VBasic a všechno další co jsem ještě neviděl), Ruby a nevím co se ještě používá na webové aplikace je rozhodně pomalejší než čistý C/C++ program (taky jak kdy ;-) ). S Forthem zkušenost nemám, stejně tak jako nemám plnohodnotné zážitky s LISPem, SmallTalkem a ostatními jazyky, ale např. Inkscape, které je psané v Pythonu jde docela dobře používat a že by bylo pomalé se mi nezdá, takže to je zase jen otázka správného návrhu, implementace a nedělání z toho to co to není. Stejně tak jako ostatní interpretované jazyky je Python použitelný na tvorbu bohatých aplikací byť webových tak desktopových a některými svými vlastnostmi a konstrukty ho lze použít i na sice ne nejefektivnější, ale přesto dostatečně rychlé a elegantní řešení úlohy. LINQ v .NET je oproti Pythonu hnůj.
Pravdepodobne zamena s programom Skencil (predtym to malo nazov Sketch) http://www.skencil.org
Pokud mate na mysli graficky vektorovy editor Inkscape, tak ten je psan v c++ (gtkmm).
Co se ale python bindingu tyce, tak ten se v praxi dela ze dvou pripadu:
- dotycna uloha(fce) by byla opravdu v pythonu pomala, nebo spatne programovatelna
- mame jiz hotovou komponentu, a chceme ji dostat do pythonu
PyDoc_STRVAR( calc__doc__, "calc" );
a další PyDoc_STRVAR
– to je makro?METH_VARARGS
asi nebude jediný možný způsob sdělení jak předat argumenty, existuje i jiný? Respektive jak předat kwargs, alespoň to by se pro začátek docela hodilo, když ne vícPokusim se odpovedet:
* je to makro. Staci pohodlne pouzivat const char*, obcas ale byvaji problemy s tim ze python ceka holy char* (t.j. pak je treba hnusny const_cast, neb novejsi gcc dela string constants const)
* METH_VARARGS neni jediny. Existuji jeste METH_NOARGS, METH_KEYWORDS (Funkce potom musi byt typu PyCFunctionWithKeywords)
* docstring neni povinny, ale pokud chcete generovat dokumentaci k API, hodi se (napr. epydoc je uziva)
* Neslysel jsem o primem napojeni pythonu a C, ale existuji alternativy, napriklad hojne pouzivany Boost::Python (coz je defakto jenom sada sablon)
1) Ano, PyDoc_STRVAR
je makro.
2) Ano, existuje více způsobů. Podívejte se do dokumentace. Naleznete například METH_KEYWORDS
, METH_NOARGS
, ..
3) Dokumentační řetězec můžeme úplně vynechat, je to nepovinný. Tedy například stačí { "minus", py_minus, METH_VARARGS }
. Já si však myslím, že je dobré psát alespoň základní dokumentaci o funkci, a tím je její hlavička.
4) Tento příklad byl testován na 2.6. Pro Python 3 jsem to nezkoušel, vyzkouším.
5) Zda lze zavolat C funkce přímo v Pythonu nevím, nikde jsem se s tím nesetkal a podle mě to ani není možné.
Samozřejmě není potřeba si psát vlastní moduly v C/C++ (zvlášť tento příklad), ale pokud píšeme nějaký výpočtově náročný program a chceme dbát na rychlost, tak je velmi vhodné si napsat výpočet v C/C++.
Kdysi jsem něco podobného už na roota psal: http://www.root.cz/…-pro-python/
Ale naštěstí jsem od té doby 6 let na python nasáhnul a všechno jsem zapomněl.
Zdravim,
vetsina fci v Python/C API hazi pri problemu vyjimku rovnou uvnitr a vraci jen NULL nebo neco ekvivalentniho. Kdyz se podivate do dokumentace, tak zjistite, ze toto dela i PyArg_ParseTuple(). Nastavovani vyjimky v okamziku, kdy uz tam jednu mate, se povazuje za dost velkou chybu…
Psat to takhle primo mi prijde hrozne neprehledne a nachylne na chyby v porovnani s pouzitim swigu. Se swigem odpadaji manualni konverze, parsovani argumentu a swig se umi vyporadat s pretizenymi funkcemi a sablonami (C++). Sice to chvili trva naucit se, ale pak se hodne casu usetri (a navic je mozne pozit knihovnu jak v pythonu, tak v C/C++).
Priklad pro C++, pro C by to bylo jeste jednodussi (jenom 20 radku kdyz nepocitam includy): http://www.pastebin.cz/25296
Header wrapovany tim swig scriptem: http://www.pastebin.cz/25300
Myslim ze jedna z nejlepsich moznosti je pouzit cython (cython.org). Umi udelat wrappery na C i C++, ale pritom to vygeneruje jednoduchy C soubor, takze je do toho videt, co se tam deje. Krome toho lze cython pouzit i primo, na urychleni kriticke casti kodu (v pythonu).