LINUX.ORG.RU

cython ругается на pow


0

1

пытаюсь ускорить скрипты. что можно сделать?

cython my_module.py вываливает ошибки однотипные, ругается на pow

Error converting Pyrex file to C:
------------------------------------------------------------
...
    
    Wt=array([1.,.0,.0])-1.5/pow(linalg.norm(x),5.)*x
                              ^
------------------------------------------------------------

 Call with wrong number of arguments (expected 3, got 2)

Ответ на: комментарий от anonymous

так вот, я тоже не понял зачем и восмпользовался **, кстати в инете есть примеры, что ** быстрее pow.

pow(x, y, z) (Note 2)

Note 2: Only the three-argument form of pow() is supported. Use the ** operator otherwise.

math-beginer
() автор топика
Ответ на: комментарий от true_admin

Поделитесь опытом ускорения Python скриптов.

просто перевод Питон модулей инструментом cython что не дал мне результатов. Скорость работы скрипта с модулями *.so не увеличилась :-( , правда оперативной памяти раза в полтара меньше использует. В коде функций модуля в основном заполняются матрицы, а в головном скрипте выполняюс матричнфе преобразования методами numpy/scipy

math-beginer
() автор топика
Ответ на: комментарий от math-beginer

Надо понимать, что ты ускоряешь. Например, в чистом Питоне довольной ресурсоёмкий вызов функций/методов, можно сыграть на этом. Можно заменить свои классы на встроенные, тогда можно получить большое ускорение при доступе к приватным полям и методам. А ещё можно заменить переменные Питона (PyObject) на переменные C (int, char *, ...), тогда математика будет сильно быстрее. Советую читать туториал по Cython, там все эти идеи неплохо описаны.

Ну и да, меньше оперативной памяти - уже результат.

Divius ★★
()
Ответ на: комментарий от math-beginer

Я тоже пробовал cython, результата на небольшом скрипте не дало. И это логично ибо всё что cython делает это убирает необходимость в интерпретации байт-кода, всё остальное остаётся на месте.

Серьёзно оптимизацией не занимался т.к. мне либо скорости всегда хватало, либо в программе не было каких-то ярко выраженных «hot spots» которые можно было бы улучшить. Я как-то страдал фигнёй изучая какие конструкции языка лучше работают, но сидеть над каждой строчкой в программе быстро надоело т.к. это очень сильно снижает скорость разработки.

На уровне самого питона посмотри в сторону pypy.

Можешь почитать вот это:
http://docs.python.org/faq/programming.html#my-program-is-too-slow-how-do-i-s...
http://wiki.python.org/moin/PythonSpeed/PerformanceTips

Но я не советую особо этим загоняться, это просто ударит по читабельности и скорости разработки. Если прям уж действительно нужна скорость то тогда чистый питон это плохой выбор. Можно найти либо сишную библиотеку которая решает задачу либо самому налабать с использованием, например, cython. Но писать придётся типизированный код, иначе прироста в большинстве случаев не ощутить.

true_admin ★★★★★
()
Ответ на: комментарий от math-beginer

подскажите, пожайлуста, в общих (глобальных) чертах как ускорить такой код (из таких функций состоит модуль; передаются один/два вектора с элементами double и несколько параметров типа double, всякие действия состоят из вызовом небольших функций из этого же модуля) и возвращается матрица nixnj с элементами типа double:

def my_matrix_maker(vector1,vector2,param1,param2,paramX):
    ni=len(vector1)
    nj=len(vector2)
    for i in range(ni):
        # ряд действий
        for j in range(nj):
                # всякие  действия
                A[i][j]= ...
    return A
если можно, ткните в документацию (желательно на русском ).

Спасибо.

math-beginer
() автор топика
Ответ на: комментарий от true_admin

можно ли так?

def my_matrix_maker(double * vector1, double * vector2, double param1, double param2, double paramX):
    ni=len(vector1)
    nj=len(vector2)
    for i in range(ni):
        # ряд действий
        for j in range(nj):
                # всякие  действия
                A[i][j]= ...
    return A

math-beginer
() автор топика
Ответ на: комментарий от math-beginer

Я извиняюсь, вбросил сюда много сообщений, но что-то даже простой пример с типами не могу собрать:

#!/usr/bin/python
import numpy as np
cimport numpy as np
ctypedef np.float64_t dtype_t
def ff(dtype a):
     return a;

$ cython test.py 

Error converting Pyrex file to C:
------------------------------------------------------------
...
#!/usr/bin/python
import numpy as np
cimport numpy as np
       ^
------------------------------------------------------------

math-beginer
() автор топика
Ответ на: комментарий от math-beginer

У тебя cython какой-то неправильный, поставь другой или собери из сырцов. У меня всё заработало. Только не dtype а dtype_t.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

поставил cython из сырцов версии 0.14.1 , ситуация не изменилась :(

math-beginer
() автор топика
Ответ на: комментарий от math-beginer

Циклы на Питоне для вычислений просто не подходят. Если твоя задача требует производительности и при этом не ложится на numpy, на Питоне ее делать не стоит.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

не ложиться на numpy только одна из частей программы, заполнение некоторых блоков матриц, она вынесена в циклы и тормозит. В большей своей части алгоритмы сформулированы на матричном языке и успешно реализованы на numpy.

math-beginer
() автор топика
Ответ на: комментарий от math-beginer

> не ложиться на numpy только одна из частей программы, заполнение некоторых блоков матриц, она вынесена в циклы и тормозит.

Сделай ее на чистом Си.

tailgunner ★★★★★
()
Ответ на: комментарий от math-beginer

Это стандартный пакет Питона, его документация - часть стандартной Library Reference.

tailgunner ★★★★★
()
Ответ на: комментарий от math-beginer

переименоввал test.py в test.pyx и .... сработало

у меня и без переименования работало. Стандартный cython из бубунты 10.10

true_admin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.