-
-
Save apalala/3fbbeb5305584d2abe05 to your computer and use it in GitHub Desktop.
| from __future__ import print_function | |
| from math import sin, cos, radians | |
| import timeit | |
| ''' | |
| A simple Python benchmark. | |
| Results on an overclocked AMD FX-8150 Eight-Core CPU @ 3.0 GHz, and | |
| an Intel Core i5-2410M CPU @ 2.30GHz. | |
| $ python -OO bench.py | |
| 1.99843406677 2.00139904022 2.0145778656 | |
| 2.38226699829 2.38675498962 2.38853287697 | |
| $ python3 -OO bench.py | |
| 2.2073315899979207 2.2098999509980786 2.222747125000751 | |
| 2.273064840992447 2.274112678001984 2.2759074380010134 | |
| $ pypy -OO bench.py | |
| 0.245079994202 0.24707698822 0.247714996338 | |
| 0.241708040237 0.242873907089 0.245008945465 | |
| $ pypy3 -OO bench.py | |
| 1.1291401386260986 1.1360960006713867 1.1375579833984375 | |
| 1.2108190059661865 1.2172389030456543 1.2178328037261963 | |
| ''' | |
| def bench(): | |
| product = 1.0 | |
| for counter in range(1, 1000, 1): | |
| for dex in list(range(1, 360, 1)): | |
| angle = radians(dex) | |
| product *= sin(angle)**2 + cos(angle)**2 | |
| return product | |
| if __name__ == '__main__': | |
| result = timeit.repeat('bench.bench()', setup='import bench', number=10, repeat=10) | |
| result = list(sorted(result)) | |
| print(*result[:3]) |
Maybe the list() on line 33 produces variations that depend on the memory manager or system load?
The benchmark could use just the range(), or precompute the list.
...I did the optimization, and it had no effect on my numbers.
def bench():
product = 1.0
dexes = list(range(1, 360, 1))
for counter in range(1, 1000, 1):
for dex in dexes:
angle = radians(dex)
product *= sin(angle)**2 + cos(angle)**2
return product$ python3.10 -OO bench.py
1.2302762420004 1.2326733869995223 1.23436711600516
$ pypy3 -OO bench.py
0.1486122600035742 0.15070434800873045 0.15452972600178327Comparing my old Intel MacBook to new Apple Silicon MacBook:
Both running on Python 3.9.12 in a fresh conda environment
Apple MacBook Pro 15" (2015) 2.5 GHz Quad-Core Intel Core i7 16GB Ram
$ python -OO bench.py
1.3066859839999996 1.315500633000001 1.3444327110000005
$ pypy -OO bench.py
0.13471456800016313 0.13493599199955497 0.1350344459997359
Jupyter %timeit function:
129 ms ± 615 µs per loop (mean ± std. dev. of 10 runs, 10 loops each)
Apple MacBook Pro 16" (2021) M1 Max 10-core 64GB RAM
$ python -OO bench.py
0.60054525 0.6010592090000002 0.6021369170000002
$ pypy -OO bench.py (pypy nightly build for Apple Silicon)
0.03519466705620289 0.035204792162403464 0.03520554187707603
Jupyter %timeit function:
60.7 ms ± 1.22 ms per loop (mean ± std. dev. of 10 runs, 10 loops each)
Acer Aspire A315, AMD A6 dual-core 2.9GHz, 8GB ddr4 ram, AMD R5 GPU 2GB gddr5, SSD SATA, Zorin os 16.1 pro (Linux kernel 5.15):
1.9391337739998562 1.939522442999987 1.9427987970002505
M1 Pro (2021)
Intel binaries through Rosetta 2
Python 3.10.8, osx-64 through Rosetta 2 (conda-forge)
1.580 1.589 1.591
Python 3.11.0, osx-64 through Rosetta 2 (conda-forge)
1.517 1.517 1.521
Python 3.11.2, osx-64 (binary from https://www.python.org/ftp/python/3.11.2/python-3.11.2-macos11.pkg)
1.302 1.386 1.299
Python 3.12.0a5, osx-64 through Rosetta 2 (binary from https://www.python.org/downloads/release/python-3120a5/)
1.326 1.295 1.270
Native binaries
Python 3.10.9, osx-arm64 (conda-forge)
0.762 0.762 0.769
Python 3.11.0, osx-arm64 (conda-forge)
0.637 0.637 0.637
Python 3.11.2, osx-arm64 (binary from https://www.python.org/ftp/python/3.11.2/python-3.11.2-macos11.pkg)
0.599 0.598 0.599
Python 3.12.0a5, osx-arm64 (binary from https://www.python.org/downloads/release/python-3120a5/)
0.602 0.602 0.602
Intel Pypy through Rosetta 2
pypy 3.9 (7.3.11), osx-64 through Rosetta 2 (conda-forge)
0.159 0.160 0.160
@corneliusroemer, Why not a Python 3.12.x test too?
Raspberry Pi 4B (4GB Ram): Python 3.9.2
pi17@rpi17:~ $ python3 bench.py
3.983417603000021 4.000531667000018 4.001489117999995
pi17@rpi17:~ $ pypy bench.py
0.395509004593 0.395509958267 0.395529985428
MacBook Pro 2015
$ python3.12 bench.py
1.1071506180014694 1.1081515140103875 1.1114070440089563$ pypy3
Python 3.10.12 (af44d0b8114cb82c40a07bb9ee9c1ca8a1b3688c, Jun 25 2023, 12:41:21)
[PyPy 7.3.12 with GCC Apple LLVM 14.0.0 (clang-1400.0.29.202)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>>
$ pypy3 -O bench.py
0.1369127530051628 0.13725044101011008 0.13727515301434323Macbook Air M2 2023
$ python3.11 -O bench.py
0.47316745800344506 0.47342624999873806 0.4737870000026305
$ python3.12 -O bench.py
0.5029823330041836 0.5032062500031316 0.5033741669976735
$ pypy3 -O bench.py
0.03534275000129128 0.03537720799795352 0.0354161660070531Raspberry Pi 5 Model B Rev 1.0
Official python docker image 3.13.0:
$ python
Python 3.13.0 (main, Oct 8 2024, 00:55:30) [GCC 13.2.1 20240309] on linux
$ docker run --rm -it -v $(pwd):/bench python:3.13-alpine python /bench/bench.py
1.379287590039894 1.3798810039879754 1.3804634480038658Custom python 3.13.0 compiled with --enable-experimental-jit:
$ python
Python 3.13.0 (main, Oct 9 2024, 01:04:00) [GCC 14.2.0] on linux
$ docker run --rm -it -v $(pwd):/bench my_custom_python /root/.pyenv/versions/3.13.0/bin/python /bench/bench.py
1.1263249380281195 1.1263620959362015 1.1266266249585897Not bad.
MacBook Air M2 2023
$ python3.13 --version
Python 3.13.1
$ python3.13 bench.py
0.5406068330048583 0.5409433339955285 0.5412480410013814
$ python3.13 -OO bench.py
0.5364589579985477 0.5369448330020532 0.5370732499868609

1.0594426930183545 1.062258291989565 1.0630121920257807
On Gitpod
CPU: AMD EPYC 7B13
Arch: x86_64
OS: Linux