ฉันมีรหัสนี้ซึ่งฉันได้เขียนใน 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 วินาทีพวกเขาจะชนะโดยอัตโนมัติและฉันเสีย
สถานะ
- หลาม เพิ่มความเร็ว 30 ครั้งโดย Alistair Buxon! แม้ว่าจะไม่ใช่วิธีแก้ปัญหาที่เร็วที่สุด แต่ในความเป็นจริงแล้วสิ่งที่ฉันโปรดปราน
- ระดับแปดเสียง เร็วขึ้น 100 เท่าโดย @Thethos
- สนิม เพิ่มความเร็วได้ 500 เท่าโดย @dbaupp
- C ++ Guy Sirton เร็วขึ้น 570 เท่า
- ค . เพิ่มความเร็ว 727 เท่าโดย @ace
- C ++ เร็วอย่างไม่น่าเชื่อโดย @tefan
การแก้ปัญหาที่เร็วที่สุดนั้นเร็วเกินไปที่จะทันเวลา ฉันเพิ่ม n เป็น 10 แล้วตั้งค่า iters = 100,000 เพื่อเปรียบเทียบสิ่งที่ดีที่สุด ภายใต้มาตรการนี้เร็วที่สุดคือ
- ค . 7.5 โดย @ace
- C ++ 1 วินาทีโดย @Stefan
My Machineเวลาของฉันจะทำงานบนเครื่องของฉัน นี่คือการติดตั้ง Ubuntu มาตรฐานบนโปรเซสเซอร์ AMD FX-8350 Eight-Core นี่ก็หมายความว่าฉันต้องสามารถเรียกใช้รหัสของคุณได้
การติดตามโพสต์เนื่องจากการแข่งขันนี้ค่อนข้างง่ายเกินไปที่จะได้รับ x100 speedup ฉันได้โพสต์ติดตามผลสำหรับผู้ที่ต้องการฝึกความเชี่ยวชาญด้านกูรูความเร็ว ดูว่า Python ช้าแค่ไหน (ตอนที่ 2) จริงหรือ