LINUX.ORG.RU

История изменений

Исправление 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