Sedikit cython





Kami mendapatkan Cythona, berkat isolasi diri. Masalahnya biasa-biasa saja - bagaimana mempercepat dengan python dengan kehilangan sintaks yang minimal. Salah satu pendekatannya adalah dengan menggunakan Cython (campuran C dan python). Publikasi dengan judul yang lantang



tidak memberikan istirahat . Tapi sedikit yang bisa dipelajari dari konten publikasi, karena rumus dan tabel yang dihasilkan tidak benar. Mari kita coba untuk melengkapi gambar yang dimulai oleh penulis postingan dan beri titik dan.



* Pengujian dilakukan pada odroid xu4, ubuntu mate, python 2.7.17.

Cython mudah dipasang (pip install cython).



Kami akan menyiksa semua angka Fibonacci yang sama. Mari buat file untuk pengujian perolehan kinerja. Untuk bahasa python (test.py):



def test(n):
   a, b = 0.0, 1.0
   for i in range(n):
      a, b = a + b, a
   print (a)


Untuk bahasa cython (test2.pyx):



def test2(int n):
   cdef int i
   cdef double a=0.0, b=1.0
   for i in range(n):
      a, b = a + b, a
   print (a)


File cython membutuhkan pra-pembuatan. Mari buat sebuah setup.py untuk itu dengan konten berikut:



from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules=cythonize('test2.pyx'))


Dan kumpulkan:



python setup.py build_ext --inplace


Sekarang mari kita ambil file dari posting yang disebutkan dengan tes dan perbaiki sedikit dengan menambahkan kemampuan untuk memasukkan nomor Anda sendiri di awal (tests.py):



import test
import test2
import time

number = input('enter number: ')

start = time.time()
test.test(number)
end =  time.time()

py_time = end - start
print("Python time = {}".format(py_time))

start = time.time()
test2.test(number)
end =  time.time()

cy_time = end - start
print("Cython time = {}".format(cy_time))
print("Speedup = {}".format(py_time / cy_time))


Mari kita lihat apa yang terjadi:



python tests.py


Hasil:



Untuk python 2.7:

enter number: 10
Python time = 1.62124633789e-05
Cython time = 4.05311584473e-06
Speedup = 4.0

enter number: 100
Python time = 3.40938568115e-05
Cython time = 5.00679016113e-06
Speedup = 6.80952380952

enter number: 1000
Python time = 0.000224113464355
Cython time = 1.19209289551e-05
Speedup = 18.8

enter number: 100000
Python time = 0.0200171470642
Cython time = 0.000855922698975
Speedup = 23.3866295265




Untuk python 3:



enter number: 10
Python time = 7.653236389160156e-05
Cython time = 2.8133392333984375e-05
Speedup = 2.7203389830508473

enter number: 100
Python time = 8.678436279296875e-05
Cython time = 3.170967102050781e-05
Speedup = 2.736842105263158

enter number: 1000
Python time = 0.00031876564025878906
Cython time = 4.673004150390625e-05
Speedup = 6.821428571428571

enter number: 100000
Python time = 0.01643967628479004
Cython time = 0.0004260540008544922
Speedup = 38.5858981533296




* modul test2.pyx telah "dibangun kembali" dengan perintah:

python3 setup.py build_ext --inplace

** diinstal oleh cython:

pip3 install cython



Anda dapat melakukannya tanpa membangun test2.pyx menggunakan setup.py, untuk ini Anda hanya perlu menambahkan baris ke file tests.py :



import pyximport
pyximport.install()


Sekarang test2.pyx akan dibuat dengan cepat setiap kali tests.py dijalankan, dan akan ada lebih sedikit file di folder.



Cara mendapatkan cython di windows.



Terlepas dari kenyataan bahwa cython memungkinkan merakit file untuk python3 dan python2, itu tidak mungkin untuk mendapatkan resep yang sudah jadi untuk python3 .

Dengan python3, perintah build berfungsi:

python setup.py build_ext -i --compiler=msvc


Namun, untuk pekerjaannya yang lengkap, Anda perlu menginstal sebagian dari komponen visual studio 2019. Apa yang sebenarnya harus diinstal ditunjukkan dalam solusi di sini .



Oleh karena itu, ada dua opsi kerja yang memungkinkan Anda untuk bekerja (membangun file) di windows dengan cython.



Yang pertama menggunakan python2.7 dan kompiler mingw.

Prosedurnya adalah sebagai berikut.

1. Instal cython sendiri di bawah python2.7:

py -2 -m pip install cython


2. Instal kompilator mingw:

mingw

3. Setelah menginstal kompilator dan menambahkannya ke jendela PATH, file .pyx dapat dikompilasi dengan perintah:

python setup.py build_ext -i --compiler=mingw32


Yang kedua adalah menggunakan python3.x dan kompiler msvc.



Cara menjalankan cython di notebook jupyter.



Terkadang perlu untuk menguji kerja kode secara visual menggunakan jupyter. Agar tidak mengkompilasi kode dalam cmd setiap saat, Anda dapat menggunakan cython tepat di sel jupyter.

Untuk melakukan ini, impor cython dengan mengeksekusi di sel jupyter:

%load_ext cython


Dan mari jalankan beberapa kode di sel berikutnya:

%%cython -a
import numpy as np

cdef int max(int a, int b):
    return a if a > b else b

cdef int chebyshev(int x1, int y1, int x2, int y2):
    return max(abs(x1 - x2), abs(y1 - y2))

def c_benchmark():
    a = np.random.rand(1000, 2)
    b = np.random.rand(1000, 2)
    
    for x1, y1 in a:
        for x2, y2 in b:
            chebyshev(x1, x2, y1, y2)


Jika semuanya berhasil maka outputnya akan seperti ini:




All Articles