Skip to content

Commit a5b4476

Browse files
fix build on windows
1 parent b441e1b commit a5b4476

File tree

2 files changed

+64
-1
lines changed

2 files changed

+64
-1
lines changed

Include/internal/pycore_dict.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ PyAPI_FUNC(int) _PyDict_SetItem_KnownHash_LockHeld(PyDictObject *mp, PyObject *k
145145
PyObject *value, Py_hash_t hash);
146146
// Export for '_asyncio' shared extension
147147
PyAPI_FUNC(int) _PyDict_GetItemRef_KnownHash_LockHeld(PyDictObject *op, PyObject *key, Py_hash_t hash, PyObject **result);
148-
extern int _PyDict_GetItemRef_KnownHash(PyDictObject *op, PyObject *key, Py_hash_t hash, PyObject **result);
148+
PyAPI_FUNC(int) _PyDict_GetItemRef_KnownHash(PyDictObject *op, PyObject *key, Py_hash_t hash, PyObject **result);
149149
extern int _PyDict_GetItemRef_Unicode_LockHeld(PyDictObject *op, PyObject *key, PyObject **result);
150150
PyAPI_FUNC(int) _PyObjectDict_SetItem(PyTypeObject *tp, PyObject *obj, PyObject **dictptr, PyObject *name, PyObject *value);
151151

bench_dict_known_hash.py

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import time
2+
3+
N = 50_000_000
4+
5+
6+
def bench_get_str(n):
7+
d = {'a': 1, 'b': 2, 'c': 3}
8+
x = 0
9+
for _ in range(n):
10+
x += d['a']
11+
return x
12+
13+
14+
def bench_get_int(n):
15+
d = {1: 10, 2: 20, 3: 30}
16+
x = 0
17+
for _ in range(n):
18+
x += d[1]
19+
return x
20+
21+
22+
def bench_store_str(n):
23+
d = {}
24+
for _ in range(n):
25+
d['a'] = 1
26+
return d
27+
28+
29+
def bench_store_int(n):
30+
d = {}
31+
for _ in range(n):
32+
d[1] = 1
33+
return d
34+
35+
36+
def bench_get_multi(n):
37+
d = {'a': 1, 1: 2, b'x': 3, (1, 2): 4}
38+
x = 0
39+
for _ in range(n):
40+
x += d['a'] + d[1] + d[b'x'] + d[(1, 2)]
41+
return x
42+
43+
44+
def run(name, func, n):
45+
# warmup
46+
func(1000)
47+
t0 = time.perf_counter()
48+
func(n)
49+
dt = time.perf_counter() - t0
50+
print(f"{name:25s} {dt:.3f}s ({n/dt/1e6:.1f}M iter/s)")
51+
52+
53+
if __name__ == "__main__":
54+
import sys
55+
import os
56+
jit = "JIT" if os.environ.get("PYTHON_JIT", "1") == "1" else "no JIT"
57+
print(f"Python {sys.version.split()[0]} ({jit})\n")
58+
59+
run("dict_get[str]", bench_get_str, N)
60+
run("dict_get[int]", bench_get_int, N)
61+
run("dict_store[str]", bench_store_str, N)
62+
run("dict_store[int]", bench_store_int, N)
63+
run("dict_get[multi]", bench_get_multi, N // 4)

0 commit comments

Comments
 (0)