Python / NumPy로 작성한이 코드가 있습니다
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)
그것은 두 개의 랜덤 배열의 컨볼 루션 수를 세고 있는데, 하나는 특정 확률 분포로 하나는 다른 것보다 길고 첫 번째 위치는 0이거나 두 위치는 0입니다.
나는 파이썬이 빠를 필요가있는 코드를 작성하는 끔찍한 언어라고 말하는 친구와 내기를했습니다. 내 컴퓨터에서 9 초가 걸립니다. 그는 "적절한 언어로"작성하면 100 배 더 빨라질 수 있다고 말합니다.
문제는 선택한 코드에서이 코드가 실제로 100 배 더 빠를 수 있는지 확인하는 것입니다. 나는 당신의 코드를 테스트 할 것이고 지금부터 가장 빠른 일주일이 이길 것입니다. 누군가가 0.09s 이하로 떨어지면 자동으로 이기고 잃습니다.
지위
- 파이썬 . Alistair Buxon으로 30 배 속도 향상! 가장 빠른 해결책은 아니지만 실제로 가장 좋아합니다.
- 옥타브 . @Thethos로 100 배 속도가 향상됩니다.
- 녹 . @dbaupp에 의해 500 배가 빨라집니다.
- C ++ . Guy Sirton의 570 배 속도.
- C . @ace로 727 배가 빨라집니다.
- C ++ . @Stefan에 의해 믿을 수 없을 정도로 빠릅니다.
가장 빠른 솔루션은 현재 너무 빠르기 때문에 시간이 너무 빠릅니다. 따라서 n을 10으로 늘리고 iters = 100000을 설정하여 최고의 것을 비교했습니다. 이 측정에서 가장 빠릅니다.
- C . @ace에 의해 7.5s.
- C ++ . @Stefan의 1입니다.
내 컴퓨터 타이밍이 내 컴퓨터에서 실행됩니다. 이것은 AMD FX-8350 8 코어 프로세서에 표준 우분투 설치입니다. 이것은 또한 코드를 실행할 수 있어야 함을 의미합니다.
후속 소식 게시이 경쟁은 x100 속도 향상을 얻기가 너무 쉬웠으므로 속도 전문가의 전문 지식을 행사하려는 사람들을 위해 후속 조치를 게시했습니다. 파이썬이 얼마나 느리게 진행 되는가 (II 부)를 참조하십시오 .