История изменений
Исправление fsb4000, (текущая версия) :
На нынешний момент достаточно эффективной статической типизации для питона нет,
А как же Cython? Почему он вообще не взлетел и считается низкоуровневой оптимизацией? Мы же просто расставляем типы и всё.
Для тех кто не в теме Cython, вот пример:
Код на питоне
# code.py
import math, sys
def _is_prime( num ):
if num <= 1:
return False
if num == 2:
return True
limit = int(math.sqrt(num))
limit += 1
for i in range(2, limit):
if num % i == 0:
return False
return True
def main():
limit = int(sys.argv[1])
limit += 1
for x in range( 0, limit ):
if _is_prime( x ):
print( x )
if __name__=="__main__":
main()
Для Cython, создаём файл с расширением pxd и расставляем там типы, оригинальный питоновский код не меняется(не обязательно везде использовать cython типы, можно и обычные Python если нужна его длинная арифметика или другие типы)
#code.pxd
import cython
@cython.locals(i=cython.int,limit=cython.int)
cdef bint _is_prime (int num)
@cython.locals(limit=cython.int)
@cython.locals(x=cython.int)
cpdef main()
Где здесь вообще оптимизация? Не более чем расставлять типы по PEP 526.
Зато есть практический результат:
$ cat main.py
import code
if __name__=="__main__":
code.main()
$ time /c/Python27/python.exe main.py 1000000 > /dev/nul
real 0m1,234s
user 0m0,015s
sys 0m0,031s
$ time /c/Python27/python.exe code.py 1000000 > /dev/nul
real 0m14,745s
user 0m0,015s
sys 0m0,031s
$ time ./code_c.exe 1000000 > /dev/nul
real 0m0,613s
user 0m0,015s
sys 0m0,047s
Исправление fsb4000, :
На нынешний момент достаточно эффективной статической типизации для питона нет,
А как же Cython? Почему он вообще не взлетел и считается низкоуровневой оптимизацией? Мы же просто расставляем типы и всё.
Для тех кто не в теме Cython, вот пример:
Код на питоне
# code.py
import math, sys
def _is_prime( num ):
if num <= 1:
return False
if num == 2:
return True
limit = int(math.sqrt(num))
limit += 1
for i in range(2, limit):
if num % i == 0:
return False
return True
def main():
limit = int(sys.argv[1])
limit += 1
for x in range( 0, limit ):
if _is_prime( x ):
print( x )
if __name__=="__main__":
main()
Для Cython, создаём файл с расширением pxd и расставляем там типы(не обязательно везде использовать cython типы, можно и обычные Python если нужна его длинная арифметика или другие типы)
#code.pxd
import cython
@cython.locals(i=cython.int,limit=cython.int)
cdef bint _is_prime (int num)
@cython.locals(limit=cython.int)
@cython.locals(x=cython.int)
cpdef main()
Где здесь вообще оптимизация? Не более чем расставлять типы по PEP 526.
Зато есть практический результат:
$ cat main.py
import code
if __name__=="__main__":
code.main()
$ time /c/Python27/python.exe main.py 1000000 > /dev/nul
real 0m1,234s
user 0m0,015s
sys 0m0,031s
$ time /c/Python27/python.exe code.py 1000000 > /dev/nul
real 0m14,745s
user 0m0,015s
sys 0m0,031s
$ time ./code_c.exe 1000000 > /dev/nul
real 0m0,613s
user 0m0,015s
sys 0m0,047s
Исходная версия fsb4000, :
На нынешний момент достаточно эффективной статической типизации для питона нет,
А как же Cython? Почему он вообще не взлетел и считается низкоуровневой оптимизацией? Мы же просто расставляем типы и всё.
Для тех кто не в теме Cython, вот пример:
Код на питоне
# code.py
import math, sys
def _is_prime( num ):
if num <= 1:
return False
if num == 2:
return True
limit = int(math.sqrt(num))
limit += 1
for i in range(2, limit):
if num % i == 0:
return False
return True
def main():
limit = int(sys.argv[1])
limit += 1
for x in range( 0, limit ):
if _is_prime( x ):
print( x )
if __name__=="__main__":
main()
Для Cython, создаём файл с расширением pxd и расставляем там типы(не обязательно везде использовать cython типы, можно и обычные Python если нужна его длинная арифметика или другие типы)
#code.pxd
import cython
@cython.locals(i=cython.int,limit=cython.int)
cdef bint _is_prime (int num)
@cython.locals(limit=cython.int)
@cython.locals(x=cython.int)
cpdef main()
Где здесь вообще оптимизация? Не более чем расставлять типы по PEP 526.
Зато есть практический результат:
$ cat main.py
import code
if __name__=="__main__":
code.main()
$ time /c/Python27/python.exe main.py 1000000 > /dev/nul
real 0m1,234s
user 0m0,015s
sys 0m0,031s
$ time /c/Python27/python.exe code.py 1000000 > /dev/nul
real 0m14,745s
user 0m0,015s
sys 0m0,031s