Skip to content

Instantly share code, notes, and snippets.

@apalala
Last active November 6, 2023 01:45
Show Gist options
  • Star 14 You must be signed in to star a gist
  • Fork 5 You must be signed in to fork a gist
  • Save apalala/3fbbeb5305584d2abe05 to your computer and use it in GitHub Desktop.
Save apalala/3fbbeb5305584d2abe05 to your computer and use it in GitHub Desktop.
A simple Python benchmark
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])
@vinaydeep26
Copy link

This doesn't work?

@logiota
Copy link

logiota commented Sep 4, 2021

Apple M1 MacBook Air 16GB gets:
python -OO bench.py
0.645364999771 0.645573139191 0.646193981171
python3 -OO bench.py
0.6115190000000004 0.6118404580000001 0.611904

with 13 apps in the background :)

@Space646
Copy link

AMD Ryzen 7 3700x with 48GB RAM:
1.8907193999999992 1.8923012000000021 1.8995879999999996
with 9 apps in the background

@logiota
Copy link

logiota commented Oct 1, 2021

I'm 3X faster? Which python version did you run?

@heungson
Copy link

heungson commented Oct 7, 2021

Snapdragon 865+ (Samsung Galaxy Tab S7+, Ubuntu 20.04 on Termux in Android with Samsung Dex, Python 3.8)
0.9339403639896773 0.9342242699931376 0.9347601039917208
I am not sure which apps are in the background. Anyway, results are pretty consistent.

@apalala
Copy link
Author

apalala commented Oct 8, 2021

Why the sudden interest on this benchmark?

@TanujW
Copy link

TanujW commented Nov 9, 2021

Apple MacBook Pro 15" (2015) 2.5 GHz Quad-Core Intel Core i7 16GB Ram

python -OO bench.py
1.1667073040000004 1.1672709139999995 1.1685495430000001

python3 -OO bench.py
1.2099393779999996 1.2139072740000003 1.2139641090000008

pypy -OO bench.py
0.13471456800016313 0.13493599199955497 0.1350344459997359

pypy3 -OO bench.py
0.13697827399937523 0.13717118099975778 0.13746063700000377

Jupyter %timeit function:
115 ms ± 2.06 ms per loop (mean ± std. dev. of 10 runs, 10 loops each)

I'm surprised that such an old machine is doing so well. However, only 2 apps in background, and CPU usage was idling at 8-10% prior to the test.

@andrix
Copy link

andrix commented Nov 9, 2021

Apple M1 Pro 16GB Ram gets:
Python 3.9.7

✗ python -OO bench.py
0.6188454170000002 0.6192598749999999 0.6194524169999998

Not pypy available build for M1 yet (at least in homebrew).

@Chekote
Copy link

Chekote commented Nov 11, 2021

@apalala Not sure about everyone else, but I needed an easy way to compare certain applications performance on x86 vs ARM

@Uglevod
Copy link

Uglevod commented Mar 25, 2022

heh )
Nexus 5 - Postmarket OS
31.562464889000694 31.56695511900034 31.588837952996982
Asus A53 Intel i7
1.829460040997219 1.8857796539996343 1.8871137909991376
its only sitgle threads ?

@apalala
Copy link
Author

apalala commented Mar 27, 2022

Macbook Air from early 2015

$ python3.9 bench.py
1.6820437410000002 1.6992794439999992 1.7123132529999996

$ python3.10 bench.py
1.4265755990054458 1.4323118559550494 1.4479744010022841

$ python3.11 bench.py
1.2640831180033274 1.268143099034205 1.282965452002827

$ pypy3 bench.py
0.13054357696091756 0.13099552801577374 0.1329099930007942

@wangxu627
Copy link

wangxu627 commented Apr 11, 2022

E3 1230 V2:
PS G:> python -OO .\bench.py
3.2582996999999994 3.3040652 3.321830900000002

R2S Soft Router:
$ python -OO bench.py
13.691393590997905 13.70187233100296 13.703434251016006

Baidu Yun 1C2G VM:
root@lsizINeXaH:~# python3 -OO bench.py
1.8363916339876596 1.8446048560144845 1.8466756780107971

Mac Mini Intel i5@2.3GHz
wangxudeMini:workfolder wangxu$ python3 -OO bench.py
3.1054392130000004 3.1057074900000003 3.386463592000002

Mi 11 Ultra Snapdragon 888:
TBD

@karakanb
Copy link

karakanb commented May 12, 2022

I was curious about the impact of QEMU on M1 Macbooks with x86 Docker images, so I ran this benchmark.

Specs:

  • My device is 2021 14" MBP with M1 Pro and 32GB RAM.
  • My Python version is 3.10.
  • Docker has 11GB RAM and 3 cores available.

Below are the results:

  • Running natively: 0.6509173749946058 0.6511464999057353 0.6511690000770614
  • Running in a native arm64 container: 0.5683689580037026 0.5695775839994894 0.5701702090009348
  • Running in an x86 emulated container: 14.544861840011436 14.5703257569985 14.61461971499375

So, as expected, the emulated container is much slower than the native ones, but I couldn't really figure out what was the deal with the Docker container being faster than running the script directly.

@CandideThunder
Copy link

if someone is interested: running the benchmark on pyodide (python inbrowser, Node.js, based on WebAssembly), it runs about 1.3 sec per iteration. That is about twice as native. (MBA M1, firefox)

@atlasbioinfo
Copy link

Looks interesting. I tested Rossetta compiled python (anaconda) and native python (miniforge)

Specs:

  • Macbook pro M1 Max
  • Anaconda python version is: 3.9.7, miniforge is 3.9.10

Anaconda:
1.3440638339999995 1.345124833 1.345285625

Miniforge:
0.637413166 0.6387493339999999 0.638863084

∩( ・ω・)∩

@CLOUDUH
Copy link

CLOUDUH commented May 26, 2022

Apple Mac mini 8G anaconda Python 3.9
0.6556459589999992 0.6564532079999998 0.6569619580000001

I also tested it with my ASUS Laptop
ASUS ZX53V i5-7300HQ 12G 2133
2.1350787999999987 2.1404666 2.142507799999999

That's amazing!

@singhsidhukuldeep
Copy link

singhsidhukuldeep commented Jul 23, 2022

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

@apalala
Copy link
Author

apalala commented Jul 26, 2022

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.15452972600178327

@TanujW
Copy link

TanujW commented Jul 26, 2022

Comparing 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)

@paul1339
Copy link

image

@cristinelpopescu
Copy link

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

@corneliusroemer
Copy link

corneliusroemer commented Feb 24, 2023

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

@apalala
Copy link
Author

apalala commented Feb 24, 2023

@corneliusroemer, Why not a Python 3.12.x test too?

Copy link

ghost commented May 18, 2023

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

@apalala
Copy link
Author

apalala commented Jul 4, 2023

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.13727515301434323

@apalala
Copy link
Author

apalala commented Jul 20, 2023

Macbook 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.0354161660070531

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment