Last active
June 12, 2020 15:54
-
-
Save vezeli/31986659ce6fa808c11bad3ebba428a7 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" | |
The results of the script are used in blog article called | |
"Revisiting the Mechanism Behind the `for` Statement" hosted at | |
https://mylette.rs/revisiting-the-mechanism-behind-the-for-statement. | |
Purpose: The script measures the performance of iterating over all | |
elements in an iterable with two different implementation methods, namely | |
using Pythonic and non-Pythonic design patterns. See functions | |
`loop_pythonic` and `loop_with_indexes` for details. | |
Requirements: Python version >= 3.3 | |
License: MIT License (see https://opensource.org/licenses/MIT) | |
""" | |
from functools import wraps | |
from time import perf_counter | |
ITERABLE = range(1000000) # <-- change here e.g. ITERABLE = list(range(1000000)) | |
def timeit(func): | |
"""Minimalistic decorator for timing the performance of `func`""" | |
@wraps(func) | |
def chronometer(*args): | |
t1 = perf_counter() | |
rv = func(*args) | |
t2 = perf_counter() | |
print("{:=^40}".format(func.__qualname__)) | |
print(f"Elapsed time: {t2 - t1} s") | |
return rv | |
return chronometer | |
@timeit | |
def loop_for(iterable): | |
"""Retrieve elements of `iterable` with the for-loop | |
Demonstrates the Pythonic way of iterating over objects. | |
""" | |
for item in iterable: | |
item | |
return None | |
@timeit | |
def loop_indexes(iterable): | |
"""Retrieve elements of `iterable` with indexes | |
Demonstrates non-Pythonic way of iterating over objects. | |
""" | |
for index in range(len(iterable)): | |
iterable[index] | |
return None | |
@timeit | |
def loop_while(iterable): | |
"""Retrieve elements of `iterable` with the while-loop | |
Demonstrates the mechanism behind the for-loop. | |
""" | |
_i = iter(iterable) | |
_loop = True | |
while _loop: | |
try: | |
item = next(_i) | |
except StopIteration: | |
_loop = False | |
else: | |
item | |
return None | |
if __name__ == "__main__": | |
loop_for(ITERABLE) | |
loop_indexes(ITERABLE) | |
loop_while(ITERABLE) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment