Python / Numpy dizi işlemlerinin performansı artan dizi boyutlarıyla nasıl ölçeklenir?


21

Python / Numpy dizileri artan dizi boyutlarıyla nasıl ölçeklenir?

Bu, bu soru için Python kodunu karşılaştırırken fark ettiğim bazı davranışlara dayanıyor: Bu karmaşık ifadenin en iyi dilimler kullanılarak nasıl ifade edileceği

Sorun çoğunlukla bir diziyi doldurmak için dizin oluşturmayı içeriyordu. Python döngüsünde (çok iyi olmayan) Cython ve Numpy sürümlerini kullanmanın avantajlarının ilgili dizilerin boyutuna bağlı olarak değiştiğini buldum. Hem Numpy hem de Cython , dizüstü bilgisayarımda (Cython için ve N = 2000 civarında geniş bir yer) bir noktaya kadar artan bir performans avantajı yaşar, bundan sonra avantajları azalır (Cython işlevi en hızlı kaldı).N-=500N-=2000

Bu donanım tanımlanmış mı? Büyük dizilerle çalışma açısından, performansın takdir edildiği kod için kişinin uyması gereken en iyi uygulamalar nelerdir?

Vectorized ve Cython uygulamaları için döngülü koda göre yürütme süresinin grafiği

Bu soru ( Neden Matrix-Vektör Çarpma Ölçeklemem? ) İlişkili olabilir, ancak Python ölçeğindeki dizileri nasıl tedavi etmenin farklı biçimlerde olduğunu görmeyi daha fazla bilmek istiyorum.


Eğer denediniz numexpr ? Örneğin, da var bu konuşma işaret blosc ve CArray , tüm diğer (ve muhtemelen atlayarak bellek bant genişliği sınırlamaları) kadar hız şeyler geliyordu.
0 0

1
Profil için kullanılan kodu gönderebilir misiniz? Muhtemelen burada bir şeyler oluyor.
meawoppl

Yanıtlar:


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]

Bu testte yanlış olan birkaç şey var, bir başlangıç ​​için, çöp toplanmasını engellemiyorum ve toplamı en iyi zamana değil, yanımda taşıyacağım.

800064kB

Kişi önbellek boyutu için endişelenmeli mi? Genel bir kural olarak, hayır diyorum. Bunu Python'da optimize etmek, şüpheli performans kazanımları için kodu daha karmaşık hale getirmek anlamına gelir. Python nesnelerinin, izlemesi ve tahmin etmesi zor birkaç ek yük eklediğini unutmayın. Bunun sadece ilgili bir faktör olduğu iki durumu düşünebilirim:

  • Bellek bant genişliği ile sınırlı olarak büyük dizilerdeki temel işlemler (bir polinomu değerlendirmek gibi). Kullanım Numexpr veya (veri çok daha büyük ise) Pytables . Diğer optimizasyonların yanı sıra önbellek boyutunu da dikkate alacak şekilde optimize edilmiştir.
  • Performans kritik kodu: Her mikrosaniyeyi sıkmak istiyorsanız, ilk başta Python kullanmamalısınız. Vectorized Yazma Cython ve derleyici bırakarak neyi en iyi yaptığı muhtemelen gitmek için ağrısız bir şekilde yapmak.

Yorumlarda, Evert CArray bahsetti. Çalışmanın bile gelişiminin durduğunu ve bağımsız bir proje olarak terk edildiğini unutmayın. İşlevselliği dahil edilecektir Blaze yerine, devam eden bir proje "yeni nesil Numpy" yapmak için.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.