Thread View: pl.comp.lang.python
13 messages
13 total messages
Started by Marek
Wed, 25 Nov 2009 13:05
Wykonywanie rozszerzeń w C
Author: Marek
Date: Wed, 25 Nov 2009 13:05
Date: Wed, 25 Nov 2009 13:05
13 lines
1116 bytes
1116 bytes
Witam, Zależy mi, aby w aplikacji w Pythonie czas wykonywania algorytmu (akurat jest to naiwne wyszukiwanie liczb pierwszych w przedziałach) był porównywalny z implementacjami w C. Niestety, dla miliona liczb czas wykonania algorytmu w Pythonie jest ok 10x dłuższy. Moje pytanie brzmi - czy implementacja tego algorytmu w C, jako rozszerzenie Pythona rzeczywiście spowoduje, że będzie on liczony szybciej? pozdrawiam Marek
Re: Wykonywanie rozszerzeń w C
Author: MAcks
Date: Wed, 25 Nov 2009 13:28
Date: Wed, 25 Nov 2009 13:28
16 lines
1620 bytes
1620 bytes
W dniu 25.11.2009 14:05, Marek pisze: > Zależy mi, aby w aplikacji w Pythonie czas wykonywania algorytmu (akurat > jest to naiwne wyszukiwanie liczb pierwszych w przedziałach) był > porównywalny z implementacjami w C. Niestety, dla miliona liczb czas > wykonania algorytmu w Pythonie jest ok 10x dłuższy. > Moje pytanie brzmi - czy implementacja tego algorytmu w C, jako > rozszerzenie Pythona rzeczywiście spowoduje, że będzie on liczony > szybciej? Zanim zaczniesz ręcznie pisać rozszerzenie w C, spróbuj użyć Cythona [1]. Powinno się obyć bez specjalnych modyfikacji kodu. Ewentualnie możesz pododawać informacje o typach zmiennych, aby działało szybciej. Daj znać, czy pomogło. [1] http://www.cython.org/
Re: Wykonywanie rozszerzeń w C
Author: Rob Wolfe
Date: Wed, 25 Nov 2009 14:13
Date: Wed, 25 Nov 2009 14:13
20 lines
1923 bytes
1923 bytes
Marek napisał(a): > Witam, > > Zależy mi, aby w aplikacji w Pythonie czas wykonywania algorytmu (akurat > jest to naiwne wyszukiwanie liczb pierwszych w przedziałach) był > porównywalny z implementacjami w C. Niestety, dla miliona liczb czas > wykonania algorytmu w Pythonie jest ok 10x dłuższy. > Moje pytanie brzmi - czy implementacja tego algorytmu w C, jako > rozszerzenie Pythona rzeczywiście spowoduje, że będzie on liczony > szybciej? Odpowiedz brzmi: bezapelacyjnie tak. Wszelkie biblioteki obliczeniowe Pythona bazuja na takich rozszerzeniach. Chocby sage: http://www.sagemath.org/doc/reference/sage/rings/arith.html?highlight=primes#sage.rings.arith.primes RW
Re: Wykonywanie rozszerzeń w C
Author: Marek
Date: Wed, 25 Nov 2009 20:41
Date: Wed, 25 Nov 2009 20:41
15 lines
1224 bytes
1224 bytes
Dnia Wed, 25 Nov 2009 06:13:13 -0800, Rob Wolfe napisał(a): > Odpowiedz brzmi: bezapelacyjnie tak. Dzięki wielkie za odpowiedź. Czy macie jakąś podpowiedź jak można z poziomu distutils wpłynąć na opcje kompilacji? W algorytmie używam bibliotek math.h, ktory zawsze linkowałem opcją -lm podczas kompilacji gcc/g++. Tutaj jednak nie wiem jak mogę to zmienic, albo skomfigurować distutils, aby podlinkował biblioteke. pozdrawiam Marek
Re: Wykonywanie rozszerzeń w C
Author: Rob Wolfe
Date: Wed, 25 Nov 2009 21:58
Date: Wed, 25 Nov 2009 21:58
18 lines
1562 bytes
1562 bytes
Marek <marek@octogan.usun.net> writes: > Dnia Wed, 25 Nov 2009 06:13:13 -0800, Rob Wolfe napisał(a): > >> Odpowiedz brzmi: bezapelacyjnie tak. > > Dzięki wielkie za odpowiedź. > > Czy macie jakąś podpowiedź jak można z poziomu distutils wpłynąć na opcje > kompilacji? > W algorytmie używam bibliotek math.h, ktory zawsze linkowałem opcją -lm > podczas kompilacji gcc/g++. Tutaj jednak nie wiem jak mogę to zmienic, > albo skomfigurować distutils, aby podlinkował biblioteke. Przeszukaj grupę, to było wałkowane wielokrotnie, np. tu: http://groups.google.pl/group/pl.comp.lang.python/browse_thread/thread/59d430dac5ecf762 RW
Re: Wykonywanie rozszerzeń w C
Author: Radomir Dopieralski
Date: Thu, 26 Nov 2009 07:18
Date: Thu, 26 Nov 2009 07:18
26 lines
2175 bytes
2175 bytes
At Wed, 25 Nov 2009 06:13:13 -0800 (PST), Rob Wolfe wrote: > > > Marek napisał(a): >> Witam, >> >> Zależy mi, aby w aplikacji w Pythonie czas wykonywania algorytmu (akurat >> jest to naiwne wyszukiwanie liczb pierwszych w przedziałach) był >> porównywalny z implementacjami w C. Niestety, dla miliona liczb czas >> wykonania algorytmu w Pythonie jest ok 10x dłuższy. >> Moje pytanie brzmi - czy implementacja tego algorytmu w C, jako >> rozszerzenie Pythona rzeczywiście spowoduje, że będzie on liczony >> szybciej? > > Odpowiedz brzmi: bezapelacyjnie tak. > Wszelkie biblioteki obliczeniowe Pythona bazuja na takich > rozszerzeniach. > Chocby sage: > http://www.sagemath.org/doc/reference/sage/rings/arith.html?highlight=primes#sage.rings.arith.primes Hint, hint: ktos to juz napisal i zoptymalizowal, nie musisz pisac swojego... -- Radomir Dopieralski, http://sheep.art.pl
Re: Wykonywanie rozszerzeń w C
Author: Marek
Date: Thu, 26 Nov 2009 13:03
Date: Thu, 26 Nov 2009 13:03
11 lines
1258 bytes
1258 bytes
Dnia Thu, 26 Nov 2009 07:18:28 +0000, Radomir Dopieralski napisał(a): > Hint, hint: ktos to juz napisal i zoptymalizowal, nie musisz pisac > swojego... Paradoksalnie chodzi o to, aby algorytm nie był zoptymalizowany i odpowiednio długo się liczył dla odpowiednich przedziałów liczb, dlatego też chciałem napisać swoje rozszerzenie. Priorytetem jest taki sam czas obliczen w porównaniu z implementacją w C. Anyway, dzięki za pomoc.
Re: Wykonywanie rozszerzeń w C
Author: Marek
Date: Thu, 26 Nov 2009 16:38
Date: Thu, 26 Nov 2009 16:38
19 lines
1642 bytes
1642 bytes
Dnia Wed, 25 Nov 2009 22:58:38 +0100, Rob Wolfe napisał(a): > Przeszukaj grupę, to było wałkowane wielokrotnie, np. tu: > http://groups.google.pl/group/pl.comp.lang.python/browse_thread/ thread/59d430dac5ecf762 Widziałem podobne rozwiązania i wstawilem je do setup.py, ale coś przeoczylem bo błędy okazalo sye być z powodu literówki w kodzie c. W każdym bądź razie mam jeszcze mały dziwny problem. Ten sam kod w ANSI C (działający), przepisany na kod pythonowy wywala się na dzieleniu modulo (operator %) dwóch zmiennych int. Jestem pewien, że to to, bo po zakomentowaniu wszystko dziala i daje wyniki. Błędem jest komunikat "Błąd w obliczeniach zmiennoprzecinkowych" W google nie udało mi się znaleźć za wiele na ten temat. Jak to można naprawić? Marek
Re: Wykonywanie rozszerzeń w C
Author: Rob Wolfe
Date: Thu, 26 Nov 2009 18:11
Date: Thu, 26 Nov 2009 18:11
24 lines
1721 bytes
1721 bytes
Marek <marek@octogan.usun.net> writes: > Dnia Wed, 25 Nov 2009 22:58:38 +0100, Rob Wolfe napisał(a): [...] > W każdym bądź razie mam jeszcze mały dziwny problem. > Ten sam kod w ANSI C (działający), przepisany na kod pythonowy wywala się > na dzieleniu modulo (operator %) dwóch zmiennych int. > Jestem pewien, że to to, bo po zakomentowaniu wszystko dziala i daje > wyniki. > Błędem jest komunikat "Błąd w obliczeniach zmiennoprzecinkowych" > W google nie udało mi się znaleźć za wiele na ten temat. > Jak to można naprawić? Czy aby dobrze pobierasz parametry do funkcji w rozszerzeniu? Obstawiam, że zamiast int-ów: PyArg_ParseTuple(args, "ii", &x, &y) pobierasz double: PyArg_ParseTuple(args, "dd", &x, &y) RW
Re: Wykonywanie rozszerzeń w C
Author: Marek
Date: Thu, 26 Nov 2009 18:36
Date: Thu, 26 Nov 2009 18:36
55 lines
2186 bytes
2186 bytes
Dnia Thu, 26 Nov 2009 19:11:22 +0100, Rob Wolfe napisał(a):
>
> Czy aby dobrze pobierasz parametry do funkcji w rozszerzeniu?
Raczej tak, zreszta te parametry nie mają wtedy znaczenia, bo dzielenie
modulo wykonuje na intach zadeklarowanych w funkcji.
Oto funkcja, z tego program wykłada się przy dzieleniu modulo.
Gdy się dzieli przez jakąś stałą, nie ważne czy zapisaną w zmiennej czy
wpisaną na sztywno wszystko działa. Gdzie jest kruczek?
#v+
#include <Python.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
static PyObject *count (PyObject* self, PyObject* args)
{
int start,stop;
int i,x;
if(!PyArg_ParseTuple(args,"ii",&start,&stop))
return NULL;
int sq;
PyObject *list = PyList_New(0);
PyObject *po;
//start counting primes
for(i=start;i<stop;i++)
{
int candidate = (int)i;
int moduler;
sq =(int)floor(sqrt(i));
for(x=0;x<=sq;x++)
{
// ERROR ERROR
if(i % x == 0) break;
}
//found prime, add to the list
if(x>sq) {
po = PyInt_FromLong((long)i);
if(PyList_Append(list,po))
return NULL;
}
}
return list;
};
#v-
Marek
Re: Wykonywanie rozszerzeń w C
Author: Rob Wolfe
Date: Thu, 26 Nov 2009 19:05
Date: Thu, 26 Nov 2009 19:05
16 lines
1597 bytes
1597 bytes
Marek <marek@octogan.usun.net> writes: > Dnia Thu, 26 Nov 2009 19:11:22 +0100, Rob Wolfe napisał(a): > > >> >> Czy aby dobrze pobierasz parametry do funkcji w rozszerzeniu? > Raczej tak, zreszta te parametry nie mają wtedy znaczenia, bo dzielenie > modulo wykonuje na intach zadeklarowanych w funkcji. > Oto funkcja, z tego program wykłada się przy dzieleniu modulo. > Gdy się dzieli przez jakąś stałą, nie ważne czy zapisaną w zmiennej czy > wpisaną na sztywno wszystko działa. Gdzie jest kruczek? Obawiam się, że "i % 0" to nienajlepszy pomysł. ;) RW
Re: Wykonywanie rozszerzeń w C
Author: Marek
Date: Thu, 26 Nov 2009 20:22
Date: Thu, 26 Nov 2009 20:22
10 lines
1074 bytes
1074 bytes
Dnia Thu, 26 Nov 2009 20:05:19 +0100, Rob Wolfe napisał(a): > > Obawiam się, że "i % 0" to nienajlepszy pomysł. ;) ARGH.... Dzieki ;) M
Re: Wykonywanie rozszerzeń w C
Author: Piotr Husiatynski
Date: Sun, 29 Nov 2009 16:53
Date: Sun, 29 Nov 2009 16:53
23 lines
1593 bytes
1593 bytes
Dnia 25.11.2009 Marek <marek@octogan.usun.net> napisał/a: > Witam, > > Zależy mi, aby w aplikacji w Pythonie czas wykonywania algorytmu (akurat > jest to naiwne wyszukiwanie liczb pierwszych w przedziałach) był > porównywalny z implementacjami w C. Niestety, dla miliona liczb czas > wykonania algorytmu w Pythonie jest ok 10x dłuższy. > Moje pytanie brzmi - czy implementacja tego algorytmu w C, jako > rozszerzenie Pythona rzeczywiście spowoduje, że będzie on liczony > szybciej? > > pozdrawiam > > Marek Możliwe, że zadowalający wzrost wydajności da użycie odpowiednich bibliotek (na przykład numpy?). Można też napisać implementacje krytycznych miejsc w czystym C, a w Pythonie używać tego za pomocą ctypes. -- Piotr Husiatyński
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads