나는 sorted_containers 의 출처를보고 있었고이 줄 을보고 놀랐습니다 .
self._load, self._twice, self._half = load, load * 2, load >> 1
여기 load
정수가 있습니다. 한 곳에서 비트 이동을 사용하고 다른 곳에서 곱셈을 사용하는 이유는 무엇입니까? 비트 쉬프팅이 2의 정수 나누기보다 빠를 수도 있지만, 곱셈을 쉬프트로 대체하지 않는 이유는 무엇입니까? 다음과 같은 경우를 벤치마킹했습니다.
- (시간, 나누기)
- (시프트, 시프트)
- (시간, 교대)
- (시프트, 나누기)
# 3이 다른 대안보다 지속적으로 빠릅니다.
# self._load, self._twice, self._half = load, load * 2, load >> 1
import random
import timeit
import pandas as pd
x = random.randint(10 ** 3, 10 ** 6)
def test_naive():
a, b, c = x, 2 * x, x // 2
def test_shift():
a, b, c = x, x << 1, x >> 1
def test_mixed():
a, b, c = x, x * 2, x >> 1
def test_mixed_swapped():
a, b, c = x, x << 1, x // 2
def observe(k):
print(k)
return {
'naive': timeit.timeit(test_naive),
'shift': timeit.timeit(test_shift),
'mixed': timeit.timeit(test_mixed),
'mixed_swapped': timeit.timeit(test_mixed_swapped),
}
def get_observations():
return pd.DataFrame([observe(k) for k in range(100)])
질문:
시험이 유효합니까? 그렇다면 왜 (곱하기, 시프트)가 (shift, shift)보다 더 빠릅니까?
우분투 14.04에서 Python 3.5를 실행합니다.
편집하다
위는 질문의 원래 진술입니다. Dan Getz는 그의 답변에서 훌륭한 설명을 제공합니다.
완전성을 위해 x
곱셈 최적화가 적용되지 않을 때 더 큰 샘플 그림이 있습니다.
x
메모리가 메모리에 어떻게 저장되는지에 대한 질문이기 때문에 매우 크지 않은 한 작업과 관련이 없을 것으로 기대합니다 .
x
했습니까?