Comments 31
Одним декоратором можно добиться такой же скорости, как и у Cython без всяких .pyx модулей и С-подобного языка. Вот рабочий код для факториала:
from numba import jit
@jit
def test(x):
y = 1
for i in range(1, x+1):
y *= i
return y
Она даже больше чем Cython ускоряет в каких-то случаях, потому что может параллельно выполнять код и другие трюки использовать.
Я имею ввиду веб-сервер где количество ядер ограничено
Единственное изменение Python-кода при этом заключается в добавлении к каждой переменной информации об её типе.
Если требуется пройти по всему коду, то может лучше тогда заодно на go переписать?
Боже, что вы намерили? Результат функции test(100000)
— это число с 456574 знаками. Не число 456574, а число с 456574 знаками.
$ ipython
Python 3.7.3 (default, Apr 3 2019, 19:16:38)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.4.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: def test(x):
...: y = 1
...: for i in range(1, x+1):
...: y *= i
...: return y
...:
In [2]: %time a = test(100000)
CPU times: user 1.76 s, sys: 3.57 ms, total: 1.76 s
Wall time: 1.76 s
In [3]: len(str(a))
Out[3]: 456574
Время работы от увеличения количество итераций должно расти явно не линейно, так как длина арифметики тоже увеличивается. Каким образом у вас это заняло 2 миллисекунды?
А в Cython тип int — это 32-bit signed integer: https://nyu-cds.github.io/python-cython/01-syntax/
Соответственно результат работы функции на Cython просто неверный.
Если вы имели в виду, что результат должен быть типа double (то есть y = 1.0
), то результат будет бесконечность уже для test(171)
.
Коммент об этом есть к оригиналу сего шедевра.
Разгадка, если кому интересно.
В оригинальном посте на Медиуме была ошибка, из-за которой результат функции всегда был ноль!
def test(x):
y = 1
for i in range(x):
y *= i
return y
Замеры были сделаны именно для этой версии, и тут нет длинной арифметики.
Автор оригинального поста решил не париться и убрал неверный код и результаты, оставив голословные утверждения о 36-кратном приросте производительности непонятно чего и упоминание некой таблицы, которой в посте нет:
Check out the table below which shows how much speed Cython gave us for different factorial values. We got over 36X speedup with Cython!
Авторы же перевода видимо захотели исправить код, получили работающую в тысячи раз медленнее версию на питоне и неверно работающую версию на Cython.
С puppy та же петрушка, но при использовании falcon pypy таки дает гдето 10-20%(из обещаных 200+)
Cython и пытается это делать, можно python код без изменений оставить, но будет работать медленнее:
http://docs.cython.org/en/latest/src/tutorial/pure.html
In some cases, it’s desirable to speed up Python code without losing the ability to run it with the Python interpreter. While pure Python scripts can be compiled with Cython, it usually results only in a speed gain of about 20%-50%.
А после такого объявления переменная будет видна после цикла или нет?cdef int i for i in range(1, x+1): y *= i
Cython: более чем 30-кратное ускорение Python-кода