cython
1# mode: run
2# tag: openmp, pure3.6
3
4import cython
5from cython.parallel import prange, parallel
6
7
8def prange_regression(n: cython.int, data: list):
9"""
10>>> prange_regression(10, list(range(1, 4)))
1119
12"""
13s: cython.int = 0
14i: cython.int
15d: cython.int[3] = data
16
17for i in prange(n, num_threads=3, nogil=True):
18s += d[i % 3]
19return s
20
21
22def prange_with_gil(n: cython.int, x):
23"""
24>>> sum(3*i for i in range(10))
25135
26>>> prange_with_gil(10, 3)
27135
28"""
29i: cython.int
30s: cython.int = 0
31
32for i in prange(n, num_threads=3, nogil=True):
33with cython.gil:
34s += x * i
35
36return s
37
38
39@cython.cfunc
40def use_nogil(x, i: cython.int) -> cython.int:
41cx: cython.int = x
42with cython.nogil:
43return cx * i
44
45
46def prange_with_gil_call_nogil(n: cython.int, x):
47"""
48>>> sum(3*i for i in range(10))
49135
50>>> prange_with_gil(10, 3)
51135
52"""
53i: cython.int
54s: cython.int = 0
55
56for i in prange(n, num_threads=3, nogil=True):
57with cython.gil:
58s += use_nogil(x, i)
59
60return s
61