Portál AbcLinuxu, 30. dubna 2025 16:48

Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Vložit další komentář
11.3.2014 18:31 Radek Podgorny | skóre: 16
Rozbalit Rozbalit vše Re: PyPy a embedování do C/C++ aplikací
Odpovědět | Sbalit | Link | Blokovat | Admin
k cemu konkretne ze to pouzivate? nejak v tom nevidim smysl.

bez tech callbacku to vlastne jen imituje "vstupni" cast normalniho interpretu. stejny by bylo rovnou spustit 'pypy soubor.py', ne?

a callbacky je mozne nacist z toho pythonu pomoci ctypes (nebo toho cffi?) a volat je primo (tedy jaksi embedovat c do pythonu), ne?

nebo jsem uplne mimo? ;-)
http://podgorny.cz
11.3.2014 18:52 smazáno | skóre: 18 | blog: smazáno
Rozbalit Rozbalit vše Re: PyPy a embedování do C/C++ aplikací
Napriklad mas obrovskou C++ aplikaci a chces malou cast z ni implementovat v pythonu (resp. umoznit nekomu jinemu jeji rozsirovani pomoci pythonu). Klasika, napriklad skriptovani her. Tady resim jak pouzit misto CPythonu PyPy, protoze je mnohem rychlejsi (JIT).
11.3.2014 19:51 psio
Rozbalit Rozbalit vše Re: PyPy a embedování do C/C++ aplikací
Odpovědět | Sbalit | Link | Blokovat | Admin
Byly by nejake benchmarky, ze se ty komplikace s PyPy vyplatili ? Ja mam bohuzel zkusenost, ze pro nas to byla ztrata casu a na testech nam to davalo +/- stejne vysledky jako klasicky CPython a ne jenom u kodu, kterej byl brzdenej komunikaci s databazi. S rychlosti behu LuaJIT 2.x se to vubec neda srovnavat. To uz je fakt lepsi to nejnutnejsi nakodit v C, Python ma k dispozici celkem slusny rozhrani jako cffi. Alternativne v Cythonu, pokud lze resit pouzitim ceckovych datovych typu.

11.3.2014 20:44 smazáno | skóre: 18 | blog: smazáno
Rozbalit Rozbalit vše Re: PyPy a embedování do C/C++ aplikací
Zrovna u tohohle jsme zkoncili zpatky u CPythonu (+posunuti vice kodu do C++) ;-). Protoze co se tyka interface python<->c++ tak (muj) cffi kod + pypy byl pomalejsi nez CPython a jeho nativni API. A samotne testy, ktere jsou napsane v pythonu jsou velice light-weight, takze PyPy vlastne moc nepomuze, ale v jinych situacich (pokud chcete embedovat narocnejsi python kod) verim ze pomuze dost - na LuaJIT to vykonem samozrejme mit nebude.

Na druhou stranu, kolegovy jeho kod bezi nekolikanasobne rychleji jen diky tomu ze ho pusti pomoci pypy misto cpythonu (a navic nepotreboval embedovat, takze zadne komplikace) ... takze fakt zalezi jak kdy.
Jardík avatar 12.3.2014 00:21 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: PyPy a embedování do C/C++ aplikací
Odpovědět | Sbalit | Link | Blokovat | Admin
char* change_basename(char* full_path,char* new_basename) {
    char* full_path_copy = strdup(full_path);
    char* dirpath = dirname(full_path_copy);
  
    size_t new_path_len = strlen(dirpath)+1+strlen(new_basename); // +1 because of "/"
    char* new_path = (char*)malloc( new_path_len+1 ); // +1 because of terminating NULL
    memset(new_path, 0, new_path_len+1);
    strcat(new_path, dirpath);
    strcat(new_path, "/");
    strcat(new_path, new_basename);
  
    free(full_path_copy);
    return new_path;
}
Proč full_patch a new_basename není char const*? Žádný z nich nemodifikujete a pro full_patch stejně děláte kopii. Ten memset je totálně zbytečnej, použití strcat, když už znáte délky řetězců z předchozích volání, je pitomost. No ono i ta zbytečná kopie full_path je pitomost daná použití stupidní fce, která se nehodí.
Věřím v jednoho Boha.
12.3.2014 01:10 smazáno | skóre: 18 | blog: smazáno
Rozbalit Rozbalit vše Re: PyPy a embedování do C/C++ aplikací
Proč full_patch a new_basename není char const*?
Protoze jsem maslo, tohle si fixnu.
Ten memset je totálně zbytečnej
Ano je, ale nicemu nevadi protoze se zavola behem behu programu asi dvakrat. Btw. kdybych ho jen vyhodil, tak ten c string nekonci \0. Ale chapu jak to myslis.
použití strcat, když už znáte délky řetězců z předchozích volání, je pitomost.
hmmm?
No ono i ta zbytečná kopie full_path je pitomost daná použití stupidní fce
Co jsem mel pouzit misto dirname? :-/
Jardík avatar 12.3.2014 03:29 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: PyPy a embedování do C/C++ aplikací
Btw. kdybych ho jen vyhodil, tak ten c string nekonci \0
Stačí ti nastavit první byte na 0 pro první strcat(), ten ti nakonec dá další nulu pro další strcat(), ... ale jestli to voláš 2x, ok.
hmmm?
char* full_path_copy = strdup(full_path);
char* dirpath = dirname(full_path_copy);

size_t dirpath_len = strlen(dirpath);
size_t new_basename_len = strlen(new_basename);
size_t new_path_len = dirpath_len + new_basename_len + 1;

char* new_path = (char*)malloc( new_path_len+1 );
memcpy(new_path, dirpath, dirpath_len);
new_path[dirpath_len] = '/';
memcpy(new_path+dirpath_len+1, new_basename, new_basename_len);
new_path[new_path_len] = 0;
free(full_path_copy);
return new_path;
Nebo třeba použít stpcpy (POSIX only), ale memcpy je lepší, když už délku znám.
Co jsem mel pouzit misto dirname?
Nějakej strchr() by mohl stačit. Problém s dirname je ten, že modifikuje řetězec a musíš tedy alokovat kopii, následně alokuješ další pro výsledný řetězec. To když je pak třeba v cyklu, tak to může být ee.
Věřím v jednoho Boha.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.