Skip to content

Instantly share code, notes, and snippets.

@andrey-legayev
Last active November 2, 2019 21:36
Show Gist options
  • Save andrey-legayev/1489ad719dbc520d0db06bdfaa56f6c7 to your computer and use it in GitHub Desktop.
Save andrey-legayev/1489ad719dbc520d0db06bdfaa56f6c7 to your computer and use it in GitHub Desktop.
Python benchmark: is set() really fast?
import sys
import random
import time
# fetch python version string
version = str(sys.version).split(" ", 2)[0]
# define get_time() function
if sys.version_info.major == 3:
def get_time():
return time.perf_counter()
else:
# python 2 version
def get_time():
return time.time()
# benchmark
def test(size, iterations):
# prepare data
data_list = list()
i = 0
while i <= size:
data_list.append(random.random())
i += 1
# convert to tuple and set
data_tuple = tuple(data_list)
data_set = set(data_list)
# run tests
t = get_time()
j = 0
while j <= iterations:
x = j in data_list
j += 1
t1 = get_time() - t
t = get_time()
j = 0
while j <= iterations:
x = j in data_tuple
j += 1
t2 = get_time() - t
t = get_time()
j = 0
while j <= iterations:
x = j in data_set
j += 1
t3 = get_time() - t
# print results as CSV
print(", ".join([version, str(size), str(iterations), str(t1), str(t2), str(t3)]))
print("# Python Version, Array Size, Iterations, in list, in tuple, in set")
i = 1
while i <= 10000:
test(i, 10000)
i = i * 10
#!/bin/bash
for ver in 2.7 3.6 3.7 3.8; do
echo "# running tests for version $ver"
image=python:$ver
docker run --rm -v "$PWD":/src $image \
bash -c "python /src/perf-test.py"
done
@andrey-legayev
Copy link
Author

andrey-legayev commented Nov 2, 2019

Results:
Lookup for a key in set() data structure is must faster than lookup in list() or tuple() in all all major Python versions.
Also it has constant execution time.
Numbers: 0.002 sec (set) vs. 10.7 sec (list, tuple) in Python 3.x

Script output:

# running tests for version 2.7
# Python Version, Array Size, Iterations, in list, in tuple, in set
2.7.17, 1, 10000, 0.00309681892395, 0.00320911407471, 0.00244998931885
2.7.17, 10, 10000, 0.0150771141052, 0.00934600830078, 0.002032995224
2.7.17, 100, 10000, 0.0699908733368, 0.0701081752777, 0.00210094451904
2.7.17, 1000, 10000, 0.675493001938, 0.675599098206, 0.00206708908081
2.7.17, 10000, 10000, 6.70550990105, 6.68651795387, 0.00207209587097
# running tests for version 3.6
# Python Version, Array Size, Iterations, in list, in tuple, in set
3.6.9, 1, 10000, 0.004384811999898375, 0.004381762000321032, 0.002476438000030612
3.6.9, 10, 10000, 0.014039071000297554, 0.013892348000354104, 0.002434644999993907
3.6.9, 100, 10000, 0.1092279609997604, 0.10911030700026458, 0.0024445149997518456
3.6.9, 1000, 10000, 1.0666499200001454, 1.0883940899998379, 0.0024971810003080464
3.6.9, 10000, 10000, 10.876496061000125, 10.792869918000179, 0.0025605380001252342
# running tests for version 3.7
# Python Version, Array Size, Iterations, in list, in tuple, in set
3.7.5, 1, 10000, 0.004397431999677792, 0.004395890000068903, 0.0024426449999737088
3.7.5, 10, 10000, 0.014005884999733098, 0.013840296000125818, 0.0024605520002296544
3.7.5, 100, 10000, 0.11291304200040031, 0.12301392300014413, 0.0024590360003458045
3.7.5, 1000, 10000, 1.106032007000067, 1.070861749999949, 0.0025498979998701543
3.7.5, 10000, 10000, 10.704635972000233, 10.700021830999958, 0.0024611809999441903
# running tests for version 3.8
# Python Version, Array Size, Iterations, in list, in tuple, in set
3.8.0, 1, 10000, 0.004547103999811952, 0.004588472000250476, 0.0026125389999833715
3.8.0, 10, 10000, 0.014315868000267074, 0.014388877999863325, 0.002691261999643757
3.8.0, 100, 10000, 0.11120889399990119, 0.11045966400024554, 0.0026601959998515667
3.8.0, 1000, 10000, 1.079579711000406, 1.0746231389998684, 0.0026188420001744817
3.8.0, 10000, 10000, 10.719467460000033, 10.859970144999807, 0.0027028620002056414

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