Saya akan memecah jawaban saya menjadi tiga bagian. Profiling, mempercepat kode python melalui c, dan mempercepat python melalui python. Ini adalah pandangan saya bahwa Python memiliki beberapa alat terbaik untuk melihat kinerja kode Anda kemudian menelusuri hingga ke leher botol yang sebenarnya. Mempercepat kode tanpa membuat profil adalah seperti mencoba membunuh rusa dengan uzi.
Jika Anda benar-benar hanya tertarik pada produk mat-vec, saya akan merekomendasikan scipy.sparse .
Alat Python untuk pembuatan profil
profil dan modul cProfile : Modul -modul ini akan memberi Anda analisis run time standar dan tumpukan panggilan fungsi. Cukup bagus untuk menyimpan statistik mereka dan menggunakan modul pstats Anda dapat melihat data dalam beberapa cara.
kernprof : alat ini menyatukan banyak rutinitas untuk melakukan hal-hal seperti penentuan kode baris per baris
memory_profiler : alat ini menghasilkan cetakan memori baris per baris kode Anda.
Pengatur waktu IPython :timeit
Fungsi ini cukup baik untuk melihat perbedaan fungsi dengan cara interaktif cepat.
Mempercepat Python
Cython : cython adalah cara tercepat untuk mengambil beberapa fungsi dalam python dan mendapatkan kode lebih cepat. Anda dapat menghias fungsi dengan varian cython python dan menghasilkan kode c. Ini sangat mudah dikelola dan juga dapat menghubungkan ke kode tulisan tangan lain di c / c ++ / fortran dengan mudah. Ini adalah alat yang paling disukai saat ini.
ctypes : ctypes akan memungkinkan Anda untuk menulis fungsi Anda di c dan kemudian membungkusnya dengan cepat dengan dekorasi kode yang sederhana. Ini menangani semua rasa sakit dari casting dari PyObjects dan mengatur gil untuk memanggil fungsi c.
Pendekatan lain ada untuk menulis kode Anda dalam C tetapi mereka semua agak lebih untuk mengambil perpustakaan C / C ++ dan membungkusnya dengan Python.
Pendekatan hanya-python
Jika Anda sebagian besar ingin tetap berada di dalam Python, saran saya adalah mencari tahu data apa yang Anda gunakan dan memilih tipe data yang benar untuk mengimplementasikan algoritma Anda. Sudah pengalaman saya bahwa Anda biasanya akan mendapatkan lebih jauh dengan mengoptimalkan struktur data Anda kemudian c hack tingkat rendah. Sebagai contoh:
numpy : array kontingous yang sangat cepat untuk operasi array yang cepat
numexpr : pengoptimal ekspresi array yang numpy. Hal ini memungkinkan untuk ekspresi array numpy multithreading dan juga menghilangkan banyak temporer membuat numpy karena pembatasan juru bahasa Python.
blist : implementasi b-tree dari daftar, sangat cepat untuk menyisipkan, mengindeks, dan memindahkan node internal daftar
panda : kerangka data (atau tabel) analitik yang sangat cepat pada array.
pytables : tabel hierarki terstruktur cepat (seperti hdf5), terutama bagus untuk perhitungan inti dan kueri untuk data besar.