Tak z ciekawości pobawiłem się jeszcze w zagadnienia optymalizacyjne i wyszło mi cos takiego. Nie wiem czy to pomoze w przyspieszeniu realnego kodu i da sie je zastosować, ale ten przykładowy jest troche przyspieszony. Wyniki sa dość ciekawe podam je ponizej. Zapisywalem kazdy kod w odzdzielnym pliku odpalałem wszystkie za pomoca hyperfine. (Ostrzegam nazwy plików sa przypadkowe ^^)
![benchmark.png](https://4programmers.net/uploads/118242/wOfFdYTZTmqrgPjJKsZ5YTDtUoYViYaAIkovZsER.png)
A o to kody poszczególnych plików zeby mozna bylo sobie samemu porównać
#file.py
def task():
data = {
"a": [],
"b": [],
}
a_append = data["a"].append
b_append = data["b"].append
li = range(10_000_000)
for _ in li:
s1 = "text"
s2 = 123
a_append(s1)
b_append(s2)
return data
p=task()
#cext.py
def doit(lst, data):
s1 = "string"
s2 = 123
data["a_append"] = data["a"].append
data["b_append"] = data["b"].append
for i in lst:
data["a_append"](s1)
data["b_append"](s2)
return data
def task():
data = {
"a": [],
"b": [],
}
li = range(10_000_000)
return doit(li, data)
task()
#panda.py
data = {
"a": [],
"b": [],
}
def doit(list):
data["a_append"] = data["a"].append
data["b_append"] = data["b"].append
for i in list:
data["a_append"]("string")
data["b_append"](123)
list = range(10_000_000)
doit(list)
#run.py
def task():
data = {
"a": [],
"b": [],
}
li = range(10_000_000)
a_list = data["a"]
b_list = data["b"]
a_append = a_list.append
b_append = b_list.append
for _ in li:
s1 = "string"
s2 = 123
a_append(s1)
b_append(s2)
return data
task()
Jesli klucze i wartosci w słowniku byly by dymiczne to byloby takie cos znowu:
#wtime.py
def task():
data = {
"a": [],
"b": [],
# Additional dynamic keys
"c": [],
"d": [],
}
li = range(10_000_000)
keys = ["a", "b", "c", "d"]
for key in keys:
lst = data[key]
append_method = lst.append
for _ in li:
value = "string" # some dynamic value , can come from any function
append_method(value)
return data
task()
Czasy wychodza dosyć ciekawe np wychodzi na to że najszybciej python operuje na zmiennych lokalnych.