У меня есть этот код, который я написал в 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 в обеих позициях.
Я поспорил с другом, который говорит, что Python - ужасный язык для написания кода, который должен быть быстрым. Это займет 9 секунд на моем компьютере. Он говорит, что это можно сделать в 100 раз быстрее, если написать на «правильном языке».
Задача состоит в том, чтобы узнать, действительно ли этот код может быть сделан в 100 раз быстрее на любом языке по вашему выбору. Я протестирую ваш код, и через неделю победит самый быстрый. Если кто-то опускается ниже 0,09, он автоматически выигрывает, а я проигрываю.
Статус
- Python . Алистер Баксон ускоряет в 30 раз! Хотя это и не самое быстрое решение, оно на самом деле мое любимое.
- Октав . 100 раз ускоряется @Thethos.
- Rust . В 500 раз ускоряется @dbaupp.
- С ++ . Гай Сиртон в 570 раз ускоряется.
- C . 727 раз ускоряется @ace.
- С ++ . Невероятно быстро @Stefan.
Самые быстрые решения сейчас слишком быстры, чтобы разумно рассчитывать время. Поэтому я увеличил n до 10 и установил iters = 100000, чтобы сравнить лучшие. По этой мере самыми быстрыми являются.
- C . 7,5 с @ace.
- С ++ . 1s @Stefan.
Моя машина Время будет запущено на моей машине. Это стандартная установка Ubuntu на восьмиъядерный процессор AMD FX-8350. Это также означает, что мне нужно иметь возможность запускать ваш код.
Последующие сообщения Поскольку это соревнование было слишком легким, чтобы получить ускорение x100, я опубликовал продолжение для тех, кто хочет использовать свои знания в области скоростных гуру. Смотрите, насколько медлен Python на самом деле (часть II)?