事实证明,对于我的最后一个问题,获得x100加速有点太容易了。对于那些喜欢挑战但又想要更艰苦,可以真正使用其低水平技能的人,这是第二部分。挑战是要在我的计算机上测试以下python代码的速度提高100倍。
为了更加困难,我这次使用pypy。对于我来说,当前时间是使用pypy 2.2.1的1分7秒。
规则
- 第一个提交我可以运行的代码的人是正确的,并且在我的计算机上运行的速度快100倍,将获得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]
您必须在代码中使用随机种子,并且任何足以给出接近上述答案的随机数生成器都将被接受。
我的机器时间将在我的机器上运行。这是在AMD FX-8350八核处理器上的标准ubuntu安装。这也意味着我需要能够运行您的代码。
代码说明
此代码遍历由-1s和1s组成的长度为n + m-1的所有数组S。对于每个数组S,它对长度为n的1000个非零随机数组F进行采样,该数组由-1,0或1组成,并有1 / 4、1 / 2 // 14的概率采用每个值。然后,它计算F与长度为n的S的每个窗口之间的内积,直到找到一个非零的内积。leadingzerocounts
在发现零内积的每个位置上加1 。
状态
Perl。@tobyink的2.7倍减速 (与pypy而非cpython相比。)
Ĵ。@Eelvex的39倍加速。
- Ç。@ace可以加速59倍。
- 朱莉娅。快197倍,不包括启动时间(多一分钟)。包括启动时间在内的速度提高了8.5倍(在这种情况下,使用4个处理器比使用8个处理器更快)。
- Fortran。@ semi-extrinsic可以加速438倍。
- Rpython的。@primo可以加速258倍。
- C ++。@ilmale加快508倍。
(我停止为新的改进计时,因为它们太快且迭代次数太小。)
有人指出,不到一秒钟的时间是不可靠的,而且某些语言还会产生启动费用。论据是,如果要包括,还应该包括C / C ++等的编译时间。这是最快的代码的时间,迭代次数增加到100,000。
- 朱莉娅。42秒一分钟。
- C ++。@GuySirton用14秒。
- Fortran。@ semi-extrinsic拍摄的14秒钟。
- C ++。@ilmale 12秒。
- Rpython的。@primo 18岁。
- C ++。@Stefan 5s。
赢家是..斯特凡!
已发布后续挑战。你能走多高?(编码+算法挑战)。这个比较难。