Path: blob/main/python/bench/src/mypyc_micro.py
1396 views
# Selected microbenchmarks from the mypyc project.1# These are interesting little benchmarks, similar to the brython ones, but better2# See https://github.com/mypyc/mypyc-benchmarks/tree/master/microbenchmarks3# We are only doing benchmarks here that are easy to express the4# python language, e.g., some that involve a bunch of string methods aren't really5# supported. E.g., pylang doesn't have string % tuple yet.67from bench import register, all8from typing import Iterator, List91011def is_close(x: float, y: float) -> bool:12return 0.999999 <= x / y <= 1.000001131415# pylang gets killed in this generators one:161718def generators() -> None:19n = 020k = 021for i in range(100 * 1000):22for j in gen(k):23n += j24k += 125if k == 10:26k = 027assert n == 1200000, n282930def gen(n: int) -> Iterator[int]:31for i in range(n):32yield i333435register("mypyc - generators", generators)363738def str_slicing() -> None:39a = []40for i in range(1000):41a.append(f'Foobar-{i}')42a.append(f'{i} str')4344n = 045for i in range(1000):46for s in a:47n += len(s[2:-2])48if s[:3] == 'Foo':49n += 150if s[-2:] == '00':51n += 152assert n == 9789000, n535455register("str_slicing", str_slicing)565758def ord_builtin() -> None:59a = []60for i in range(1000):61a.append(f'Foobar-{i}')62a.append(f'{i}-ab-asdfsdf-asdf')63a.append('yeah')64n = 065for i in range(50):66for s in a:67for j in range(len(s)):68if 97 <= ord(s[j]) <= 122:69n += 170if is_upper_case_letter(s[j]):71n += 272if s[j] == ord('a'):73n += 374assert n == 1200000, n757677def is_upper_case_letter(ch: str) -> bool:78return 65 <= ord(ch) <= 90798081register('ord_builtin', ord_builtin)828384def matrix_multiply() -> None:85"""Naive matrix multiplication benchmark."""86SIZE = 3087SEED = 53588import random8990def setup_matrix_mult():91def make_matrix(w: int, h: int):92result = []93for i in range(h):94result.append([random.random() for _ in range(w)])95return result9697return make_matrix(SIZE, SIZE), make_matrix(SIZE, SIZE)9899def multiply(a, b):100result = []101for i in range(len(a)):102result.append([0.0] * len(b[0]))103for j in range(len(b[0])):104x = 0.0105for k in range(len(b)):106x += a[i][k] * b[k][j]107result[-1][j] = x108return result109110m, m2 = setup_matrix_mult()111for i in range(50):112m = multiply(m, m2)113114115register("matrix multiplication", matrix_multiply)116117118def int_to_float() -> None:119a = [1, 4, 6, 7, 8, 9]120x = 0.0121for i in range(1000 * 1000):122for n in a:123x += float(n)124assert x == 35000000.0, x125126127register('int_to_float', int_to_float)128129130def str_to_float() -> None:131a = ['1', '1.234567', '44324', '23.4', '-43.44e-4']132x = 0.0133for i in range(1000 * 1000):134for n in a:135x += float(n)136assert is_close(x, 44349630223.26009), x137138139register('str_to_float', str_to_float)140141142def float_abs() -> None:143a = [1, -1.234567, 44324, 23.4, -43.44e-4]144x = 0.0145for i in range(1000 * 1000):146for n in a:147x += abs(n)148assert is_close(x, 44349638911.052574), x149150151register("float_abs", float_abs)152153154def int_divmod() -> None:155a = [1, 1235, 5434, 394879374, -34453]156n = 0157for i in range(1000 * 1000):158for x in a:159q, r = divmod(x, 23)160n += q + r161assert n == 17167493000000, n162163164register("int_divmod", int_divmod)165166167def int_list() -> None:168a = list(range(200))169b = list(reversed(a))170c = [-1, 3, 7, 1234] * 40171n = 0172for i in range(4000):173n += sum_ints(a)174n += min_int(a)175n += min_int(b)176n += sum_ints(b)177n += sum_ints(c)178n += min_int(c)179assert n == 358076000, n180181182register("int_list", int_list)183184185def sum_ints(a: List[int]) -> int:186s = 0187for x in a:188s += x189return s190191192def min_int(a: List[int]) -> int:193minimum = a[0]194for i in range(1, len(a)):195x = a[i]196if x < minimum:197minimum = x198return minimum199200201def int_bitwise_ops() -> None:202a = []203for i in range(1000):204a.append(i * i * 12753 % (2**20 - 1))205b = a[10:50]206207n = 0208209for i in range(50):210for j in a:211for k in b:212j |= k213j &= ~(j ^ k)214x = j >> 5215n += x216n += x << 1217n &= 0xffffff218219assert n == 4867360, n220221222register("int_bitwise_ops", int_bitwise_ops)223224# We don't have arb precision yet225"""226def int_long_bitwise_ops() -> None:227a = []228for i in range(1000):229a.append(i * i ** (i // 15))230b = a[10:500:10]231print(b)232n = 0233234for i in range(10):235for j in a:236for k in b:237j |= k238j &= ~(j ^ k)239if (1 << (i * 19)) & j:240n += 1241n += j & 1242print(n)243assert n == 122000, n244245register("int_long_bitwise_ops", int_long_bitwise_ops)246"""247248249def list_of_dicts():250a = []251for j in range(1000):252d = {}253for i in range(j % 10):254d[f'Foobar-{j}'] = j255d[f'{j} str'] = i256# dict = so we get keys, values below in pylang257a.append(dict(d))258return a259260261def dict_iteration() -> None:262a = list_of_dicts()263264n = 0265for i in range(1000):266for d in a:267for k in d:268if k == '0 str':269n += 1270for k in d.keys():271if k == '0 str':272n += 1273for v in d.values():274if v == 0:275n += 1276for k, v in d.items():277if v == 1 or k == '1 str':278n += 1279assert n == 202000, n280281282register("dict_iteration", dict_iteration)283284285def dict_to_list() -> None:286a = list_of_dicts()287288n = 0289for i in range(100):290for d in a:291n += len(list(d.keys()))292n += len(list(d.values()))293n += len(list(d.items()))294assert n == 540000, n295296297register("dict_to_list", dict_to_list)298299# def dict_clear() -> None:300# n = 0301# for i in range(1000 * 100):302# d = {}303# for j in range(i % 4):304# d[j] = 'x'305# d.clear()306# assert len(d) == 0307308# register("dict_clear", dict_clear)309310311def dict_copy() -> None:312a = list_of_dicts()313314n = 0315for i in range(100):316for d in a:317d2 = d.copy()318d3 = d2.copy()319d4 = d3.copy()320assert len(d4) == len(d)321322323register("dict_copy", dict_copy)324325if __name__ == '__main__':326all()327328329