นี่คือการติดตามถึงPython ช้าเพียงใด? (หรือวิธีการที่รวดเร็วเป็นภาษาของคุณ?)
มันกลับกลายเป็นว่ามันง่ายเกินไปที่จะรับ x100 speedup สำหรับคำถามสุดท้ายของฉัน สำหรับผู้ที่ชอบความท้าทาย แต่ต้องการบางสิ่งที่ยากกว่าที่พวกเขาสามารถใช้ทักษะระดับต่ำของพวกเขานี่คือส่วนที่ II ความท้าทายคือการได้รับการเร่งความเร็ว x100 สำหรับรหัสหลามต่อไปนี้ซึ่งผ่านการทดสอบในคอมพิวเตอร์ของฉัน
เพื่อให้ยากขึ้นฉันใช้ pypy ครั้งนี้ เวลาปัจจุบันสำหรับฉันคือ1 นาที 7 วินาทีโดยใช้ pypy 2.2.1
กฎระเบียบ
- คนแรกที่ส่งรหัสที่ฉันสามารถเรียกใช้ได้ถูกต้องและเร็วกว่า x100 เท่าบนเครื่องของฉันจะได้รับรางวัล 50 คะแนน
- ฉันจะให้รางวัลแก่รหัสที่เร็วที่สุดหลังจากผ่านไปหนึ่งสัปดาห์
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
ผลลัพธ์ควรคล้ายกับ
[6335185, 2526840, 1041967, 439735, 193391, 87083, 40635, 19694]
คุณต้องใช้เมล็ดพันธุ์แบบสุ่มในรหัสของคุณและตัวสร้างตัวเลขสุ่มใด ๆ ที่ดีพอที่จะให้คำตอบใกล้กับข้างต้นจะได้รับการยอมรับ
My Machineเวลาของฉันจะทำงานบนเครื่องของฉัน นี่คือการติดตั้ง Ubuntu มาตรฐานบนโปรเซสเซอร์ AMD FX-8350 Eight-Core นี่ก็หมายความว่าฉันต้องสามารถเรียกใช้รหัสของคุณได้
คำอธิบายของรหัส
รหัสนี้วนซ้ำในทุกอาร์เรย์ S ที่มีความยาว n + m-1 ที่ประกอบขึ้นเป็น -1s และ 1s สำหรับแต่ละอาร์เรย์ S นั้นจะสุ่มตัวอย่างอาร์เรย์สุ่มที่ไม่เป็นศูนย์จำนวน 1,000 ค่า F ของความยาว n ประกอบด้วย -1,0 หรือ 1 โดยมีความน่าจะเป็น 1/4, 1/2, / 14 ของการรับค่าแต่ละค่า จากนั้นคำนวณผลิตภัณฑ์ภายในระหว่าง F และแต่ละหน้าต่างของ S ความยาว n จนกระทั่งพบผลิตภัณฑ์ภายในที่ไม่เป็นศูนย์ มันเพิ่ม 1 ถึงleadingzerocounts
ทุกตำแหน่งที่พบว่าผลิตภัณฑ์ภายในเป็นศูนย์
สถานะ
Perl ชะลอตัว 2.7 เท่าโดย @tobyink (เทียบกับ pypy ไม่ใช่ cpython)
เจ . เพิ่มความเร็วได้ 39 ครั้งโดย @Eelvex
- ค . ความเร็วเพิ่มขึ้น 59 เท่าโดย @ace
- จูเลีย เร็วขึ้น 197 เท่าไม่รวมเวลาเริ่มต้นโดย @ อีกหนึ่งนาที 8.5 เท่าความเร็วรวมถึงเวลาเริ่มต้น (เร็วขึ้นโดยใช้โปรเซสเซอร์ 4 ตัวในกรณีนี้มากกว่า 8)
- Fortran 438 ครั้งเร็วขึ้นโดย @ semi-extrinsic
- Rpython เพิ่มความเร็ว 258 ครั้งโดย @primo
- C ++ ความเร็วเพิ่มขึ้น 508 เท่าโดย @ilmale
(ฉันหยุดกำหนดเวลาการปรับปรุงใหม่เพราะมันเร็วเกินไปและเล็กเกินไป)
มันชี้ให้เห็นว่าการกำหนดเวลาต่ำกว่าหนึ่งวินาทีนั้นไม่น่าเชื่อถือและบางภาษามีค่าใช้จ่ายในการเริ่มต้น อาร์กิวเมนต์คือถ้าคุณจะรวมว่าคุณควรรวมเวลารวบรวมของ C / C ++ ฯลฯ นี่คือการกำหนดเวลาสำหรับรหัสที่เร็วที่สุดที่มีจำนวนการทำซ้ำเพิ่มขึ้นเป็น 100,000
- จูเลีย 42 วินาทีโดย @ อีกนาที
- C ++ 14 วินาทีโดย @GuySirton
- Fortran 14 วินาทีโดย @ semi-extrinsic
- C ++ 12 วินาทีโดย @ilmale
- Rpython 18 วินาทีโดย @primo
- C ++ 5s โดย @Stefan
ผู้ชนะคือ .. Stefan!
โพสต์ความท้าทายติดตาม คุณไปได้สูงแค่ไหน? (A + การเข้ารหัสขั้นตอนวิธีการท้าทาย) อันนี้ยากกว่า