이것은 파이썬이 얼마나 느리게 진행됩니까? (또는 언어가 얼마나 빠릅니까?) .
내 마지막 질문에 대해 x100 속도를 높이기가 너무 쉽다는 것이 밝혀졌습니다. 도전을 즐기고 있지만 저수준 기술을 실제로 사용할 수있는 더 어려운 것을 원하는 사람들을 위해 여기에 II 부가 있습니다. 문제는 내 컴퓨터에서 테스트 한 다음 파이썬 코드의 x100 속도를 높이는 것입니다.
더 어렵게하기 위해 이번에는 pypy를 사용하고 있습니다. pypy 2.2.1을 사용 하는 현재 시간은 1 분 7 초 입니다.
규칙
- 내가 실행할 수있는 코드를 제출 한 첫 번째 사람은 정확하며 내 컴퓨터에서 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]
코드에서 난수 시드를 사용해야하며 위와 가까운 답변을 제공 할 수있는 난수 생성기가 허용됩니다.
내 컴퓨터 타이밍이 내 컴퓨터에서 실행됩니다. 이것은 AMD FX-8350 8 코어 프로세서에 표준 우분투 설치입니다. 이것은 또한 코드를 실행할 수 있어야 함을 의미합니다.
코드 설명
이 코드는 -1과 1로 구성된 길이 n + m-1의 모든 배열 S를 반복합니다. 각 배열 S에 대해 -1,0 또는 1로 구성된 길이 n의 0이 아닌 임의의 1000 개의 배열 F를 각 값의 1/4, 1 / 2, / 14의 확률로 샘플링합니다. 그런 다음 0이 아닌 내부 제품을 찾을 때까지 F와 길이 n의 S의 각 창 사이의 내부 제품을 계산합니다. leadingzerocounts
내부 위치가 0 인 각 위치에 1을 더합니다 .
지위
펄 . @tobyink로 2.7 배 느려집니다. (python이 아닌 pypy와 비교)
J . @Eelvex로 39 배 속도 향상
- C . @ace로 59 배 속도가 빨라집니다.
- 줄리아 . 시작 시간을 1 분 더 단축하지 않고 197 배 더 빠릅니다. 시작 시간을 포함하여 8.5 배의 속도가 향상됩니다 (이 경우 8 개보다 4 개의 프로세서를 사용하는 것이 더 빠름).
- 포트란 . @ semi-extrinsic으로 438 배가 빨라집니다.
- Rpython . @primo로 258 배 속도를 높입니다.
- C ++ . @ilmale의 508 배 속도.
(새로운 개선은 너무 빠르고 반복기가 너무 작기 때문에 타이밍을 멈췄습니다.)
1 초 미만의 타이밍은 신뢰할 수 없으며 일부 언어의 경우 시작 비용이 있습니다. C / C ++ 등의 컴파일 시간도 포함시켜야한다고 주장하는 것이 중요합니다. 반복 횟수가 10만으로 증가한 가장 빠른 코드의 타이밍은 다음과 같습니다.
- 줄리아 . @ one-more- 분으로 42 초.
- C ++ . @GuySirton이 14 초
- 포트란 . @ semi-extrinsic에 의해 14s.
- C ++ . @ilmale의 12s.
- Rpython . @primo.
- C ++ . @Stefan의 5 초
승자는 .. 스테판!
후속 과제가 게시되었습니다. 당신은 얼마나 높이 갈 수 있습니까? (코딩 + 알고리즘 도전) . 이것은 더 어렵다.