2013-08-19 2 views
1

У меня есть функция в python, которая в основном принимает знак массива (75,150), например. Я иду из Matlab, и время исполнения выглядит примерно так же, как и эта функция. Мне интересно, работает ли знак() очень медленно, и вы знаете альтернативу делать то же самое.знак() намного медленнее в python, чем matlab?

Thx,

+0

Joseph Dunn, вы правы, я забыл много важных вещей: данные сложного массива, но затем я использую знак (real (x)) и знак (imag (y)) – tete

+0

Коэффициент 10 при выполнении скорости является нормальным между MATLAB и python, поскольку MATLAB имеет JIT (компилятор Just-In-Time). Использование pypy вместо CPython * может * улучшить производительность python рядом с MATLAB. – Bakuriu

+0

Добавление к тому, что сказал Бакуриу: код Python с использованием numpy имеет тенденцию находиться на той же скорости, что и MATLAB, если вы можете писать вещи с точки зрения встроенных векторизованных функций, но на порядок медленнее всякий раз, когда вам приходится писать явный цикл. К сожалению, некоторые вещи трудно выразить с точки зрения векторных функций ... но некоторые вещи на самом деле проще, так, как показывает ответ Джозефа Данна. – abarnert

ответ

1

Я не могу сказать вам, если это быстрее или медленнее, чем Matlab, так как я понятия не имею, какие номера вы видите там (вы не представили количественных данных на всех). Однако, насколько альтернативы идут:

import numpy as np 
a = np.random.randn(75, 150) 
aSign = np.sign(a) 

Тестирование с использованием %timeit в IPython:

In [15]: %timeit np.sign(a) 
10000 loops, best of 3: 180 µs per loop 

Поскольку цикл по массиву (и то, что происходит внутри него) реализуется в оптимизированном коде C, а не общий Python, он имеет тенденцию быть примерно на порядок быстрее - на том же стадионе, что и Matlab.


Сравнивая тот же код, как Numpy векторизованных операций против цикла Python:

In [276]: %timeit [np.sign(x) for x in a] 
1000 loops, best of 3: 276 us per loop 

In [277]: %timeit np.sign(a) 
10000 loops, best of 3: 63.1 us per loop 

Так, только 4x, как быстро здесь. (Но тогда a здесь довольно маленький.)

+0

Возможно, было бы лучше, если бы вы показали, как «np.sign» превзошел цикл Python вокруг функции «sign», а не просто показывает, насколько быстро он находится в абсолютном выражении на определенном вычислении. Я добавил тест из своей системы, но это было бы более полезно с вашей. – abarnert

+0

@abarnert Извинения, я думал, что (75,150) было размером массива OP, а не целым массивом OP. То, что вы говорите, имеет смысл. –