Python gerçekte ne kadar yavaş? (Veya diliniz ne kadar hızlı?) .
Son soruma x100 hız kazandırmak biraz zor oldu. Bu zorluğun tadını çıkaran ancak düşük seviye becerilerini gerçekten kullanabilecekleri daha zor bir şey isteyenler için, işte bölüm II. Buradaki zorluk bilgisayarımda test edildiği şekilde aşağıdaki python kodu için x100 hızlandırması sağlamak.
Daha da zorlaştırmak için bu sefer pypy kullanıyorum. Benim için şimdiki zamanlama pypy 2.2.1 kullanılarak 1 dakika ve 7 saniyedir .
kurallar
- Çalıştırabileceğim, kodumu gönderdiğim ilk kişi doğru ve makinemde x100 kat daha hızlı olduğu için 50 puan ödül kazanacak.
- Bir hafta sonra kazananı en hızlı koda vereceğim.
import itertools
import operator
import random
n = 8
m = 8
iters = 1000
# creates an array of 0s with length m
# [0, 0, 0, 0, 0, 0, 0, 0]
leadingzerocounts = [0]*m
# itertools.product creates an array of all possible combinations of the
# args passed to it.
#
# Ex:
# itertools.product("ABCD", "xy") --> Ax Ay Bx By Cx Cy Dx Dy
# itertools.product("AB", repeat=5) --> [
# ('A', 'A', 'A', 'A', 'A'),
# ('A', 'A', 'A', 'A', 'B'),
# ('A', 'A', 'A', 'B', 'A'),
# ('A', 'A', 'A', 'B', 'B'),
# etc.
# ]
for S in itertools.product([-1,1], repeat = n+m-1):
for i in xrange(iters):
F = [random.choice([-1,0,0,1]) for j in xrange(n)]
# if the array is made up of only zeros keep recreating it until
# there is at least one nonzero value.
while not any(F):
F = [random.choice([-1,0,0,1]) for j in xrange(n)]
j = 0
while (j < m and sum(map(operator.mul, F, S[j:j+n])) == 0):
leadingzerocounts[j] +=1
j += 1
print leadingzerocounts
Çıktı benzer olmalıdır
[6335185, 2526840, 1041967, 439735, 193391, 87083, 40635, 19694]
Kodunuzda rastgele bir tohum kullanmalısınız ve yukarıdakilere yakın cevaplar verebilecek kadar iyi olan herhangi bir rasgele sayı üreteci kabul edilecektir.
Benim Makine zamanlamaları benim makinede işletilecek. Bu, AMD FX-8350 Sekiz Çekirdekli İşlemciye standart bir ubuntu kurulumudur. Bu ayrıca kodunuzu çalıştırabilmem gerektiği anlamına geliyor.
Kod açıklaması
Bu kod, -1s ve 1s için oluşturulan tüm uzunlukları n + m-1 S dizilerini yineler. Her S dizisi için, her değeri alarak 1/4, 1/2, / 14 olasılık ile -1,0 veya 1 den oluşan 1000 sıfır sıfır olmayan rastgele diziyi F uzunluğu -1. Daha sonra, F ile sıfır olmayan bir iç ürün bulana kadar n uzunluktaki her bir pencere arasındaki F iç değerini hesaplar. leadingzerocounts
Sıfır bir iç ürün bulduğu her pozisyona 1 ila 1 ekler .
durum
Perl . @ Tobyink tarafından 2,7 kat yavaşlama. (Pypy ile karşılaştırıldığında cpython değil.)
J . @Eelvex tarafından 39 kez hızlandırılmış.
- C . @Ace ile 59 kat daha hızlı.
- Julia . 197 kat daha hızlı, başlama zamanı dahil değil, bir dakika daha. Başlangıç zamanı dahil 8,5 kat hızlanma (bu durumda 8'den 4 işlemci kullanmak daha hızlıdır).
- Fortran . 438 kat @ yarı-dışlayıcı tarafından hızlandırılır.
- Rpython . 258 kat @primo tarafından hızlandırılmış.
- C ++ . @İlmale tarafından 508 kat daha hızlı.
(Yeni geliştirmeleri zamanlamayı bıraktım çünkü çok hızlılar ve çok küçüktü.)
Bir saniyenin altındaki zamanlamaların güvenilir olmadığı ve ayrıca bazı dillerin başlangıç maliyeti olduğu belirtildi. Argüman, C / C ++ vb. Derleme zamanını da eklemeniz gerektiğidir. İşte en hızlı kodun zamanlamaları, yineleme sayısı 100.000'e yükselmiştir.
- Julia . Dakikada 42 saniye @.
- C ++ . @GuySirton tarafından 14 saniye.
- Fortran . 14 s @ @ yarı ekstrinsiktir.
- C ++ . 12s, @ilmale tarafından.
- Rpython . 18s (@primo) Tarafından Çekilen En Yeni Fotoğrafları İncele
- C ++ . @Stefan tarafından 5s.
Kazanan .. Stefan!
Takip zorluğu kaydedildi. Ne kadar yükseğe gidebilirsin? (Bir kodlama + algoritmalar mücadelesi) . Bu daha zor.