Python / NumPy'de yazdığım bu kod var.
from __future__ import division
import numpy as np
import itertools
n = 6
iters = 1000
firstzero = 0
bothzero = 0
""" The next line iterates over arrays of length n+1 which contain only -1s and 1s """
for S in itertools.product([-1, 1], repeat=n+1):
"""For i from 0 to iters -1 """
for i in xrange(iters):
""" Choose a random array of length n.
Prob 1/4 of being -1, prob 1/4 of being 1 and prob 1/2 of being 0. """
F = np.random.choice(np.array([-1, 0, 0, 1], dtype=np.int8), size=n)
"""The next loop just makes sure that F is not all zeros."""
while np.all(F == 0):
F = np.random.choice(np.array([-1, 0, 0, 1], dtype=np.int8), size=n)
"""np.convolve(F, S, 'valid') computes two inner products between
F and the two successive windows of S of length n."""
FS = np.convolve(F, S, 'valid')
if FS[0] == 0:
firstzero += 1
if np.all(FS == 0):
bothzero += 1
print("firstzero: %i" % firstzero)
print("bothzero: %i" % bothzero)
Biri diğerinden daha uzun olan, belirli bir olasılık dağılımına sahip iki rasgele dizinin evrişim devrinin, birinci konumda 0, her iki konumda da 0 olduğu sayıdır.
Python'un hızlı bir şekilde kod yazması için korkunç bir dil olduğunu söyleyen bir arkadaşımla bahse girdim. Bilgisayarımda 9 saniye sürer. "Uygun bir dilde" yazılsa 100 kat daha hızlı yapılabileceğini söylüyor.
Buradaki zorluk, bu kodun gerçekten seçtiğiniz herhangi bir dilde 100 kat daha hızlı yapılıp yapılmadığını görmek. Kodunuzu test edeceğim ve en hızlı bir hafta sonra kazanacaksınız. Birisi 0.09'un altına düşerse o zaman otomatik olarak kazanır ve kaybederim.
durum
- Python . Alistair Buxon tarafından 30 kat daha hızlı! En hızlı çözüm olmasa da aslında benim favorim.
- Octave . @Thethos tarafından 100 kat daha hızlı.
- Pas . @Dbaupp tarafından 500 kat daha hızlı.
- C ++ . Guy Sirton tarafından 570 kez hızlandırılıyor.
- C . @ 727 kat daha fazla hızlanıyor.
- C ++ . @Stefan tarafından inanılmaz derecede hızlı.
En hızlı çözümler artık hassas bir şekilde zamana göre çok hızlı. Bu nedenle n'yi 10'a yükselttim ve en iyilerini karşılaştırmak için iters = 100000'i ayarladım. Bu önlem altında en hızlı olanlardır.
- C . 7.5 by @ace.
- C ++ . @Stefan tarafından 1s.
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.
Takip edilen mesajlar Bu yarışma x100 hız kazanmak için oldukça kolay olduğu için, hız gurusu uzmanlıklarını geliştirmek isteyenler için takipte bulundum. Python'un Gerçekten Ne Kadar Yavaş Olduğunu Görmek (Bölüm II)?