Path: blob/main/Tools/scripts/var_access_benchmark.py
12 views
'Show relative speeds of local, nonlocal, global, and built-in access.'12# Please leave this code so that it runs under older versions of3# Python 3 (no f-strings). That will allow benchmarking for4# cross-version comparisons. To run the benchmark on Python 2,5# comment-out the nonlocal reads and writes.67from collections import deque, namedtuple89trials = [None] * 50010steps_per_trial = 251112class A(object):13def m(self):14pass1516class B(object):17__slots__ = 'x'18def __init__(self, x):19self.x = x2021class C(object):22def __init__(self, x):23self.x = x2425def read_local(trials=trials):26v_local = 127for t in trials:28v_local; v_local; v_local; v_local; v_local29v_local; v_local; v_local; v_local; v_local30v_local; v_local; v_local; v_local; v_local31v_local; v_local; v_local; v_local; v_local32v_local; v_local; v_local; v_local; v_local3334def make_nonlocal_reader():35v_nonlocal = 136def inner(trials=trials):37for t in trials:38v_nonlocal; v_nonlocal; v_nonlocal; v_nonlocal; v_nonlocal39v_nonlocal; v_nonlocal; v_nonlocal; v_nonlocal; v_nonlocal40v_nonlocal; v_nonlocal; v_nonlocal; v_nonlocal; v_nonlocal41v_nonlocal; v_nonlocal; v_nonlocal; v_nonlocal; v_nonlocal42v_nonlocal; v_nonlocal; v_nonlocal; v_nonlocal; v_nonlocal43inner.__name__ = 'read_nonlocal'44return inner4546read_nonlocal = make_nonlocal_reader()4748v_global = 149def read_global(trials=trials):50for t in trials:51v_global; v_global; v_global; v_global; v_global52v_global; v_global; v_global; v_global; v_global53v_global; v_global; v_global; v_global; v_global54v_global; v_global; v_global; v_global; v_global55v_global; v_global; v_global; v_global; v_global5657def read_builtin(trials=trials):58for t in trials:59oct; oct; oct; oct; oct60oct; oct; oct; oct; oct61oct; oct; oct; oct; oct62oct; oct; oct; oct; oct63oct; oct; oct; oct; oct6465def read_classvar_from_class(trials=trials, A=A):66A.x = 167for t in trials:68A.x; A.x; A.x; A.x; A.x69A.x; A.x; A.x; A.x; A.x70A.x; A.x; A.x; A.x; A.x71A.x; A.x; A.x; A.x; A.x72A.x; A.x; A.x; A.x; A.x7374def read_classvar_from_instance(trials=trials, A=A):75A.x = 176a = A()77for t in trials:78a.x; a.x; a.x; a.x; a.x79a.x; a.x; a.x; a.x; a.x80a.x; a.x; a.x; a.x; a.x81a.x; a.x; a.x; a.x; a.x82a.x; a.x; a.x; a.x; a.x8384def read_instancevar(trials=trials, a=C(1)):85for t in trials:86a.x; a.x; a.x; a.x; a.x87a.x; a.x; a.x; a.x; a.x88a.x; a.x; a.x; a.x; a.x89a.x; a.x; a.x; a.x; a.x90a.x; a.x; a.x; a.x; a.x9192def read_instancevar_slots(trials=trials, a=B(1)):93for t in trials:94a.x; a.x; a.x; a.x; a.x95a.x; a.x; a.x; a.x; a.x96a.x; a.x; a.x; a.x; a.x97a.x; a.x; a.x; a.x; a.x98a.x; a.x; a.x; a.x; a.x99100def read_namedtuple(trials=trials, D=namedtuple('D', ['x'])):101a = D(1)102for t in trials:103a.x; a.x; a.x; a.x; a.x104a.x; a.x; a.x; a.x; a.x105a.x; a.x; a.x; a.x; a.x106a.x; a.x; a.x; a.x; a.x107a.x; a.x; a.x; a.x; a.x108109def read_boundmethod(trials=trials, a=A()):110for t in trials:111a.m; a.m; a.m; a.m; a.m112a.m; a.m; a.m; a.m; a.m113a.m; a.m; a.m; a.m; a.m114a.m; a.m; a.m; a.m; a.m115a.m; a.m; a.m; a.m; a.m116117def write_local(trials=trials):118v_local = 1119for t in trials:120v_local = 1; v_local = 1; v_local = 1; v_local = 1; v_local = 1121v_local = 1; v_local = 1; v_local = 1; v_local = 1; v_local = 1122v_local = 1; v_local = 1; v_local = 1; v_local = 1; v_local = 1123v_local = 1; v_local = 1; v_local = 1; v_local = 1; v_local = 1124v_local = 1; v_local = 1; v_local = 1; v_local = 1; v_local = 1125126def make_nonlocal_writer():127v_nonlocal = 1128def inner(trials=trials):129nonlocal v_nonlocal130for t in trials:131v_nonlocal = 1; v_nonlocal = 1; v_nonlocal = 1; v_nonlocal = 1; v_nonlocal = 1132v_nonlocal = 1; v_nonlocal = 1; v_nonlocal = 1; v_nonlocal = 1; v_nonlocal = 1133v_nonlocal = 1; v_nonlocal = 1; v_nonlocal = 1; v_nonlocal = 1; v_nonlocal = 1134v_nonlocal = 1; v_nonlocal = 1; v_nonlocal = 1; v_nonlocal = 1; v_nonlocal = 1135v_nonlocal = 1; v_nonlocal = 1; v_nonlocal = 1; v_nonlocal = 1; v_nonlocal = 1136inner.__name__ = 'write_nonlocal'137return inner138139write_nonlocal = make_nonlocal_writer()140141def write_global(trials=trials):142global v_global143for t in trials:144v_global = 1; v_global = 1; v_global = 1; v_global = 1; v_global = 1145v_global = 1; v_global = 1; v_global = 1; v_global = 1; v_global = 1146v_global = 1; v_global = 1; v_global = 1; v_global = 1; v_global = 1147v_global = 1; v_global = 1; v_global = 1; v_global = 1; v_global = 1148v_global = 1; v_global = 1; v_global = 1; v_global = 1; v_global = 1149150def write_classvar(trials=trials, A=A):151for t in trials:152A.x = 1; A.x = 1; A.x = 1; A.x = 1; A.x = 1153A.x = 1; A.x = 1; A.x = 1; A.x = 1; A.x = 1154A.x = 1; A.x = 1; A.x = 1; A.x = 1; A.x = 1155A.x = 1; A.x = 1; A.x = 1; A.x = 1; A.x = 1156A.x = 1; A.x = 1; A.x = 1; A.x = 1; A.x = 1157158def write_instancevar(trials=trials, a=C(1)):159for t in trials:160a.x = 1; a.x = 1; a.x = 1; a.x = 1; a.x = 1161a.x = 1; a.x = 1; a.x = 1; a.x = 1; a.x = 1162a.x = 1; a.x = 1; a.x = 1; a.x = 1; a.x = 1163a.x = 1; a.x = 1; a.x = 1; a.x = 1; a.x = 1164a.x = 1; a.x = 1; a.x = 1; a.x = 1; a.x = 1165166def write_instancevar_slots(trials=trials, a=B(1)):167for t in trials:168a.x = 1; a.x = 1; a.x = 1; a.x = 1; a.x = 1169a.x = 1; a.x = 1; a.x = 1; a.x = 1; a.x = 1170a.x = 1; a.x = 1; a.x = 1; a.x = 1; a.x = 1171a.x = 1; a.x = 1; a.x = 1; a.x = 1; a.x = 1172a.x = 1; a.x = 1; a.x = 1; a.x = 1; a.x = 1173174def read_list(trials=trials, a=[1]):175for t in trials:176a[0]; a[0]; a[0]; a[0]; a[0]177a[0]; a[0]; a[0]; a[0]; a[0]178a[0]; a[0]; a[0]; a[0]; a[0]179a[0]; a[0]; a[0]; a[0]; a[0]180a[0]; a[0]; a[0]; a[0]; a[0]181182def read_deque(trials=trials, a=deque([1])):183for t in trials:184a[0]; a[0]; a[0]; a[0]; a[0]185a[0]; a[0]; a[0]; a[0]; a[0]186a[0]; a[0]; a[0]; a[0]; a[0]187a[0]; a[0]; a[0]; a[0]; a[0]188a[0]; a[0]; a[0]; a[0]; a[0]189190def read_dict(trials=trials, a={0: 1}):191for t in trials:192a[0]; a[0]; a[0]; a[0]; a[0]193a[0]; a[0]; a[0]; a[0]; a[0]194a[0]; a[0]; a[0]; a[0]; a[0]195a[0]; a[0]; a[0]; a[0]; a[0]196a[0]; a[0]; a[0]; a[0]; a[0]197198def read_strdict(trials=trials, a={'key': 1}):199for t in trials:200a['key']; a['key']; a['key']; a['key']; a['key']201a['key']; a['key']; a['key']; a['key']; a['key']202a['key']; a['key']; a['key']; a['key']; a['key']203a['key']; a['key']; a['key']; a['key']; a['key']204a['key']; a['key']; a['key']; a['key']; a['key']205206def list_append_pop(trials=trials, a=[1]):207ap, pop = a.append, a.pop208for t in trials:209ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop()210ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop()211ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop()212ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop()213ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop()214215def deque_append_pop(trials=trials, a=deque([1])):216ap, pop = a.append, a.pop217for t in trials:218ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop()219ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop()220ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop()221ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop()222ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop()223224def deque_append_popleft(trials=trials, a=deque([1])):225ap, pop = a.append, a.popleft226for t in trials:227ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop();228ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop();229ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop();230ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop();231ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop(); ap(1); pop();232233def write_list(trials=trials, a=[1]):234for t in trials:235a[0]=1; a[0]=1; a[0]=1; a[0]=1; a[0]=1236a[0]=1; a[0]=1; a[0]=1; a[0]=1; a[0]=1237a[0]=1; a[0]=1; a[0]=1; a[0]=1; a[0]=1238a[0]=1; a[0]=1; a[0]=1; a[0]=1; a[0]=1239a[0]=1; a[0]=1; a[0]=1; a[0]=1; a[0]=1240241def write_deque(trials=trials, a=deque([1])):242for t in trials:243a[0]=1; a[0]=1; a[0]=1; a[0]=1; a[0]=1244a[0]=1; a[0]=1; a[0]=1; a[0]=1; a[0]=1245a[0]=1; a[0]=1; a[0]=1; a[0]=1; a[0]=1246a[0]=1; a[0]=1; a[0]=1; a[0]=1; a[0]=1247a[0]=1; a[0]=1; a[0]=1; a[0]=1; a[0]=1248249def write_dict(trials=trials, a={0: 1}):250for t in trials:251a[0]=1; a[0]=1; a[0]=1; a[0]=1; a[0]=1252a[0]=1; a[0]=1; a[0]=1; a[0]=1; a[0]=1253a[0]=1; a[0]=1; a[0]=1; a[0]=1; a[0]=1254a[0]=1; a[0]=1; a[0]=1; a[0]=1; a[0]=1255a[0]=1; a[0]=1; a[0]=1; a[0]=1; a[0]=1256257def write_strdict(trials=trials, a={'key': 1}):258for t in trials:259a['key']=1; a['key']=1; a['key']=1; a['key']=1; a['key']=1260a['key']=1; a['key']=1; a['key']=1; a['key']=1; a['key']=1261a['key']=1; a['key']=1; a['key']=1; a['key']=1; a['key']=1262a['key']=1; a['key']=1; a['key']=1; a['key']=1; a['key']=1263a['key']=1; a['key']=1; a['key']=1; a['key']=1; a['key']=1264265def loop_overhead(trials=trials):266for t in trials:267pass268269270if __name__=='__main__':271272from timeit import Timer273274for f in [275'Variable and attribute read access:',276read_local, read_nonlocal, read_global, read_builtin,277read_classvar_from_class, read_classvar_from_instance,278read_instancevar, read_instancevar_slots,279read_namedtuple, read_boundmethod,280'\nVariable and attribute write access:',281write_local, write_nonlocal, write_global,282write_classvar, write_instancevar, write_instancevar_slots,283'\nData structure read access:',284read_list, read_deque, read_dict, read_strdict,285'\nData structure write access:',286write_list, write_deque, write_dict, write_strdict,287'\nStack (or queue) operations:',288list_append_pop, deque_append_pop, deque_append_popleft,289'\nTiming loop overhead:',290loop_overhead]:291if isinstance(f, str):292print(f)293continue294timing = min(Timer(f).repeat(7, 1000))295timing *= 1000000 / (len(trials) * steps_per_trial)296print('{:6.1f} ns\t{}'.format(timing, f.__name__))297298299