скорость Python

digenet

подскажите, можно ли на python как-то ускорить вычисления типа таких? (без использования всяких Cython)
import numpy as np
from math import sqrt
x=1.0
y=2.0
z=3.0
for j in np.arange(1,3001,1):
for i in np.arange(1, 1000001):
r=sqrt(x*x+y*y+z*z)
считается очень долго, минут 30 наверное
на Fortan то же самое за доли секунды

apl13

Вычисление r вынести за цикл? Питон не умеет в инварианты?

Maurog

считается очень долго
зацени:
import numpy as np
from math import sqrt
x=1.0
y=2.0
z=3.0
for j in np.arange(1,3001,1):
for i in np.arange(1, 1000001):

r=sqrt(x*x+y*y+z*z)
должно быть шустрее

6yrop

на C# 18 секунд для double. А у тебя double или float?

digenet

to , :
там хоть 1+2 можно написать, код чисто иллюстративный
смысл в том что нужно выполнять такого вида вычисления на двумерной сетке

6yrop

там хоть 1+2
да тут шутники собрались, галкин с петросяном и то повеселее будут

Maurog

смысл в том что нужно выполнять такого вида вычисления на двумерной сетке
если бы более конкретную формулу привели, возможно, вам порекомендовали как это реализовать с помощью numpy
ведь этот пакет как раз заточен на обработку всяких матриц и тд
смысл в том, что на голом питоне подобные вещи тормозить будут, а если уйти в си сквозь numpy, то будет уже шустрее
вот пример: http://rsdn.ru/forum/dynamic/4891987.flat
человек так же как и вы пытается все вычислить в питоне, однако умные дяди ускоряют некисло:
У меня этот код выполняется за 0.6 секунд вместо 40 для оригинального кода
успехов

bleyman

Ты ваще не понял что тебе посоветовал, между прочим. Он посоветовал тебе векторизовать своё вычисление, вместо того, чтобы писать императивные циклы. Чтобы дать более детальный совет нужно знать что именно у тебя за вычисление.
Кстати, если векторизовать не получится и боишься цитона, то зацени pypy, оно уже давно вполне production quality, распространяется в виде самодостаточного архива который не требует инсталляции (но позволяет, если хочется), и таки ускоряет довольно многие виды не особо замороченного кода до скоростей "сравнимых с сишной".

Commandor

12 секунд вместо 30 минут и никакого Cython :)

import pysqrt_c
print pysqrt_c.sqrt_speed_test(1.0,2.0,3.0)


#include <Python.h>
#include <math.h>

static PyObject* pysqrt_speed_test(PyObject* self, PyObject *args) {
double x,y,z,r;
if (!PyArg_ParseTuple(args, "ddd", &x, &y, &z)) return NULL;
int i,j;
for (i=0; i<3001; i++) {
for (j=0; j<1000001; j++) {
r=sqrt(x*x+y*y+z*z);
}
}
return Py_BuildValue("d",r);
}

static PyMethodDef ModuleMethods[] = {
{"sqrt_speed_test", pysqrt_speed_test, METH_VARARGS, "sqrt speed test"},
{NULL, NULL, 0, NULL}
};

PyMODINIT_FUNC initpysqrt_c(void) {
PyObject *m;
m = Py_InitModule("pysqrt_c", ModuleMethods);
if (!m) { return; }
}

int main(int argc, char **argv) {
Py_SetProgramName(argv[0]);
Py_Initialize();
initpysqrt_c();
return 0;
}


$ gcc -I/System/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7/ -c pysqrt_c.c
$ gcc pysqrt_c.o -lpython -o pysqrt_c.so
$ time python 1.py
3.74165738677

real 0m12.027s
user 0m12.013s
sys 0m0.013s

digenet


Ты ваще не понял что тебе посоветовал, между прочим.

с чего ты ваще это взял?
он это посоветовал и дал ссылки, с тех пор я ничего и не писал, разбираюсь
зацени pypy
ok, спасибо за совет

xronik111

А если еще -O2 добавить!111
Оставить комментарий
Имя или ник:
Комментарий: