Benchmark - Slots ou pas slots ?
Benchmark pour évaluer l’intérêt de définir un slot dans une classe Python:
import timeit
from sys import getsizeof
class SlottedPoint:
    __slots__ = ("x", "y")
    def __init__(self, x, y):
        self.x = x
        self.y = y
class NonSlottedPoint:
    def __init__(self, x, y):
        self.x = x
        self.y = y
def dictionary():
    return {
        "x": 1,
        "y": 2
    }
def check_func_performance(func: str, call_count: int = 1000000, repeat_count: int = 10):
    func_time = timeit.repeat(func, number=call_count, globals=globals(), repeat=repeat_count)
    func_time_value = sum(func_time) / repeat_count
    size = getsizeof(eval(func))
    return {
        "title": func,
        "duration": func_time_value,
        "object_size": f"{size} Byte(s)"
    }
results = check_func_performance('SlottedPoint(1, 2)')
print(results)
results = check_func_performance('NonSlottedPoint(1, 2)')
print(results)
results = check_func_performance('dictionary()')
print(results)
Résultats - Python 3.9:
| func | duration | size | 
|---|---|---|
| SlottedPoint(1, 2) | 0.3355669799999987 | 48 Byte(s) | 
| NonSlottedPoint(1, 2) | 0.42160326000000625 | 48 Byte(s) | 
| dictionary() | 0.19480267000001278 | 232 Byte(s) | 
Résultats - Python 3.10:
| func | duration | size | 
|---|---|---|
| SlottedPoint(1, 2) | 0.5916475000325591 | 48 Byte(s) | 
| NonSlottedPoint(1, 2) | 0.5538422700483352 | 48 Byte(s) | 
| dictionary() | 0.26400925999041647 | 232 Byte(s) | 

Comments