2017-04-11 1 views
0

Ceci est mon fichier fun.pyxComment optimiser ce code cython? J'ai trouvé que l'augmentation de 3 pour cent de la vitesse

cimport cython 

@cython.boundscheck(False) 
cdef long long int extr(): 
    cdef long long int i=0; 
    while i<=20000000000: 
     i=i+1 
    return i 

def fn(): 
    return extr() 

Ceci est mon fichier test.py

from fun import fn 
import time 

t1=time.time() 
print(fn()) 
print(time.time()-t1) 

Mais après avoir couru, je trouve que l'augmentation de 3% vitesse par rapport au programme python.Comment optimiser ce programme? Toutes les suggestions seraient utiles. Merci d'avance.

+0

Vouliez-vous utiliser 20 000 000 000? Je ne sais pas si Cython ferait la promotion d'une variable à un int de Python, mais si c'est le cas, il devra utiliser des routines Python. –

+2

'def extr(): return 20000000001' devrait être plutôt optimal. Qu'est-ce que tu essaies d'optimiser, et qu'est ce que tu as fait? – Useless

+0

@Useless Je veux juste optimiser cette boucle.Si vous savez s'il vous plaît aider.J'ai été en mesure d'optimiser en utilisant numba.Mais je veux le faire avec Cython. –

Répondre

1

j'ai couru les repères suivants et a trouvé un speedup approprié

cimport cython 
from cython.operator cimport preincrement as inc 
@cython.boundscheck(False) 
cpdef long long int extr(): 
    cdef long long int i=0; 
    while i<=200000: 
     inc(i) 
    return i 

fonction Python

def pextr(): 
    i=0; 
    while i<=200000: 
     i +=1 
    return i 

maintenant l'analyse comparative:

%timeit extr() 


The slowest run took 16.55 times longer than the fastest. This could mean that an intermediate result is being cached. 
10000000 loops, best of 3: 67.2 ns per loop 




%timeit pextr() 


100 loops, best of 3: 15.6 ms per loop 
In [3]: 

Êtes-vous construire correctement? Vous voudrez utiliser pyximport ou avoir un script setup.py approprié

Je remarque également que vous utilisez fn pour exécuter ce code, probablement parce que vous avez réalisé qu'il est impossible d'importer un cdef dans un fichier python. Cependant, si vous enregistrez votre fonction en tant que cpdef, vous pouvez l'utiliser directement.

+0

Merci. C'était vraiment utile. –