скорость 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?
to , :
там хоть 1+2 можно написать, код чисто иллюстративный
смысл в том что нужно выполнять такого вида вычисления на двумерной сетке
там хоть 1+2 можно написать, код чисто иллюстративный
смысл в том что нужно выполнять такого вида вычисления на двумерной сетке
там хоть 1+2да тут шутники собрались, галкин с петросяном и то повеселее будут
смысл в том что нужно выполнять такого вида вычисления на двумерной сеткеесли бы более конкретную формулу привели, возможно, вам порекомендовали как это реализовать с помощью numpy
ведь этот пакет как раз заточен на обработку всяких матриц и тд
смысл в том, что на голом питоне подобные вещи тормозить будут, а если уйти в си сквозь numpy, то будет уже шустрее
вот пример: http://rsdn.ru/forum/dynamic/4891987.flat
человек так же как и вы пытается все вычислить в питоне, однако умные дяди ускоряют некисло:
У меня этот код выполняется за 0.6 секунд вместо 40 для оригинального кодауспехов
Ты ваще не понял что тебе посоветовал, между прочим. Он посоветовал тебе векторизовать своё вычисление, вместо того, чтобы писать императивные циклы. Чтобы дать более детальный совет нужно знать что именно у тебя за вычисление.
Кстати, если векторизовать не получится и боишься цитона, то зацени pypy, оно уже давно вполне production quality, распространяется в виде самодостаточного архива который не требует инсталляции (но позволяет, если хочется), и таки ускоряет довольно многие виды не особо замороченного кода до скоростей "сравнимых с сишной".
Кстати, если векторизовать не получится и боишься цитона, то зацени pypy, оно уже давно вполне production quality, распространяется в виде самодостаточного архива который не требует инсталляции (но позволяет, если хочется), и таки ускоряет довольно многие виды не особо замороченного кода до скоростей "сравнимых с сишной".
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
Ты ваще не понял что тебе посоветовал, между прочим.
с чего ты ваще это взял?
он это посоветовал и дал ссылки, с тех пор я ничего и не писал, разбираюсь
зацени 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 то же самое за доли секунды