Описание проблемы:
У меня есть эта пользовательская функция "контрольной суммы":
NORMALIZER = 0x10000
def get_checksum(part1, part2, salt="trailing"):
"""Returns a checksum of two strings."""
combined_string = part1 + part2 + " " + salt if part2 != "***" else part1
ords = [ord(x) for x in combined_string]
checksum = ords[0] # initial value
# TODO: document the logic behind the checksum calculations
iterator = zip(ords[1:], ords)
checksum += sum(x + 2 * y if counter % 2 else x * y
for counter, (x, y) in enumerate(iterator))
checksum %= NORMALIZER
return checksum
Что я хочу протестировать как на Python3.6, так и на PyPy. Я хотел бы увидеть, будет ли функция работать лучше на PyPy, но я не совсем уверен, что является самым надежным и чистым способом сделать это.
Что я пробовал и вопрос:
В настоящее время я использую timeit
для обоих:
$ python3.6 -mtimeit -s "from test import get_checksum" "get_checksum('test1' * 100000, 'test2' * 100000)"
10 loops, best of 3: 329 msec per loop
$ pypy -mtimeit -s "from test import get_checksum" "get_checksum('test1' * 100000, 'test2' * 100000)"
10 loops, best of 3: 104 msec per loop
Мое беспокойство заключается в том, что я не совсем уверен, что timeit
- это правильный инструмент для работы на PyPy
из-за потенциальных JIT-разминков.
Кроме того, PyPy сам сообщает следующее, прежде чем сообщать результаты теста:
WARNING: timeit is a very unreliable tool. use perf or something else for real measurements
pypy -m pip install perf
pypy -m perf timeit -s 'from test import get_checksum' "get_checksum('test1' * 1000000, 'test2' * 1000000)"
Какой был бы лучший и самый точный подход для тестирования одинаковой производительности функции в этих и потенциально других реализациях Python?