Bagaimana kinerja operasi array Python / Numpy skala dengan dimensi array meningkat?

21

Bagaimana skala array Python / Numpy dengan dimensi array yang meningkat?

Ini didasarkan pada beberapa perilaku yang saya perhatikan ketika membandingkan kode Python untuk pertanyaan ini: Cara mengekspresikan ekspresi rumit ini menggunakan irisan numpy

Masalahnya sebagian besar melibatkan pengindeksan untuk mengisi array. Saya menemukan bahwa keuntungan menggunakan (tidak-sangat-baik) versi Cython dan Numpy atas loop Python bervariasi tergantung pada ukuran array yang terlibat. Baik Numpy dan Cython mengalami keunggulan kinerja yang meningkat hingga titik tertentu (di suatu tempat sekitar untuk Cython dan N = 2000 untuk Numpy di laptop saya), setelah itu keuntungan mereka menurun (fungsi Cython tetap yang tercepat).N=500N=2000

Apakah perangkat keras ini didefinisikan? Dalam hal bekerja dengan array besar, praktik terbaik apa yang harus dipatuhi untuk kode di mana kinerja dihargai?

Plot waktu eksekusi relatif terhadap kode loop untuk implementasi vektor dan Cython

Pertanyaan ini ( Mengapa Scaling Matriks-Vektor Multiplikasi saya? ) Mungkin tidak terkait, tapi saya tertarik mengetahui lebih banyak tentang bagaimana berbagai cara memperlakukan array dalam skala Python relatif satu sama lain.

Nat Wilson
sumber
Sudahkah Anda mencoba numexpr ? Ada juga, misalnya, pembicaraan ini yang mengarah ke blosc dan CArray , semua dimaksudkan untuk mempercepat lebih lanjut (dan mungkin melewati batasan bandwidth memori).
0 0
1
Bisakah Anda memposting kode yang digunakan ke profil. Mungkin ada beberapa hal yang terjadi di sini.
meawoppl

Jawaban:

5

416kB

def timeit(size):
     t0 = time.time()
     for _ in xrange(10):
         np.random.random(size)
     return time.time() - t0

sizes = np.logspace(1, 6, 40)
times = [timeit(s) for s in sizes]

Ada beberapa hal yang salah dengan tolok ukur ini, sebagai permulaan, saya tidak menonaktifkan pengumpulan sampah dan saya mengambil jumlah, bukan waktu terbaik, tetapi menanggung dengan saya.

800064kB

Haruskah orang khawatir tentang ukuran cache? Sebagai aturan umum, saya katakan tidak. Mengoptimalkannya dengan Python berarti membuat kode lebih rumit, untuk keuntungan kinerja yang meragukan. Jangan lupa bahwa objek Python menambahkan beberapa overhead yang sulit dilacak dan diprediksi. Saya hanya bisa memikirkan dua kasus di mana ini merupakan faktor yang relevan:

  • Operasi dasar pada array besar (seperti mengevaluasi polinomial), dibatasi oleh bandwidth memori. Gunakan Numexpr atau (jika datanya jauh lebih besar) Pytables . Mereka dioptimalkan untuk memperhitungkan ukuran cache di antara optimisasi lainnya.
  • Kode kritis kinerja: jika Anda ingin memeras setiap mikrodetik, Anda seharusnya tidak menggunakan Python sejak awal. Menulis Cython yang di- vektor-kan dan membiarkan kompiler melakukan yang terbaik adalah mungkin cara yang mudah untuk dilakukan.

Dalam komentarnya, Evert menyebut CArray. Perhatikan bahwa, meskipun berfungsi, pengembangan telah berhenti dan telah ditinggalkan sebagai proyek mandiri. Fungsionalitas akan dimasukkan dalam Blaze sebagai gantinya, sebuah proyek yang sedang berlangsung untuk membuat "generasi baru Numpy".

Davidmh
sumber