скорость Python
Вычисление r вынести за цикл? Питон не умеет в инварианты?
считается очень долгозацени:
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)
на C# 18 секунд для double. А у тебя double или float?
там хоть 1+2 можно написать, код чисто иллюстративный
смысл в том что нужно выполнять такого вида вычисления на двумерной сетке
там хоть 1+2да тут шутники собрались, галкин с петросяном и то повеселее будут
смысл в том что нужно выполнять такого вида вычисления на двумерной сеткеесли бы более конкретную формулу привели, возможно, вам порекомендовали как это реализовать с помощью numpy
ведь этот пакет как раз заточен на обработку всяких матриц и тд
смысл в том, что на голом питоне подобные вещи тормозить будут, а если уйти в си сквозь numpy, то будет уже шустрее
вот пример: http://rsdn.ru/forum/dynamic/4891987.flat
человек так же как и вы пытается все вычислить в питоне, однако умные дяди ускоряют некисло:
У меня этот код выполняется за 0.6 секунд вместо 40 для оригинального кодауспехов
Кстати, если векторизовать не получится и боишься цитона, то зацени pypy, оно уже давно вполне production quality, распространяется в виде самодостаточного архива который не требует инсталляции (но позволяет, если хочется), и таки ускоряет довольно многие виды не особо замороченного кода до скоростей "сравнимых с сишной".
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
Ты ваще не понял что тебе посоветовал, между прочим.
с чего ты ваще это взял?
он это посоветовал и дал ссылки, с тех пор я ничего и не писал, разбираюсь
зацени pypyok, спасибо за совет
А если еще -O2 добавить!111
Оставить комментарий
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 то же самое за доли секунды