diff options
Diffstat (limited to 'numpy/random/examples/numba')
-rw-r--r-- | numpy/random/examples/numba/extending.py | 77 | ||||
-rw-r--r-- | numpy/random/examples/numba/extending_distributions.py | 61 |
2 files changed, 0 insertions, 138 deletions
diff --git a/numpy/random/examples/numba/extending.py b/numpy/random/examples/numba/extending.py deleted file mode 100644 index d41c2d76f..000000000 --- a/numpy/random/examples/numba/extending.py +++ /dev/null @@ -1,77 +0,0 @@ -import datetime as dt - -import numpy as np -import numba as nb - -from numpy.random import PCG64 - -x = PCG64() -f = x.ctypes.next_uint32 -s = x.ctypes.state - - -@nb.jit(nopython=True) -def bounded_uint(lb, ub, state): - mask = delta = ub - lb - mask |= mask >> 1 - mask |= mask >> 2 - mask |= mask >> 4 - mask |= mask >> 8 - mask |= mask >> 16 - - val = f(state) & mask - while val > delta: - val = f(state) & mask - - return lb + val - - -print(bounded_uint(323, 2394691, s.value)) - - -@nb.jit(nopython=True) -def bounded_uints(lb, ub, n, state): - out = np.empty(n, dtype=np.uint32) - for i in range(n): - out[i] = bounded_uint(lb, ub, state) - - -bounded_uints(323, 2394691, 10000000, s.value) - -g = x.cffi.next_double -cffi_state = x.cffi.state -state_addr = x.cffi.state_address - - -def normals(n, state): - out = np.empty(n) - for i in range((n + 1) // 2): - x1 = 2.0 * g(state) - 1.0 - x2 = 2.0 * g(state) - 1.0 - r2 = x1 * x1 + x2 * x2 - while r2 >= 1.0 or r2 == 0.0: - x1 = 2.0 * g(state) - 1.0 - x2 = 2.0 * g(state) - 1.0 - r2 = x1 * x1 + x2 * x2 - f = np.sqrt(-2.0 * np.log(r2) / r2) - out[2 * i] = f * x1 - if 2 * i + 1 < n: - out[2 * i + 1] = f * x2 - return out - - -print(normals(10, cffi_state).var()) -# Warm up -normalsj = nb.jit(normals, nopython=True) -normalsj(1, state_addr) - -start = dt.datetime.now() -normalsj(1000000, state_addr) -ms = 1000 * (dt.datetime.now() - start).total_seconds() -print('1,000,000 Polar-transform (numba/PCG64) randoms in ' - '{ms:0.1f}ms'.format(ms=ms)) - -start = dt.datetime.now() -np.random.standard_normal(1000000) -ms = 1000 * (dt.datetime.now() - start).total_seconds() -print('1,000,000 Polar-transform (NumPy) randoms in {ms:0.1f}ms'.format(ms=ms)) diff --git a/numpy/random/examples/numba/extending_distributions.py b/numpy/random/examples/numba/extending_distributions.py deleted file mode 100644 index 9233ccced..000000000 --- a/numpy/random/examples/numba/extending_distributions.py +++ /dev/null @@ -1,61 +0,0 @@ -r""" -On *nix, execute in randomgen/src/distributions - -export PYTHON_INCLUDE=#path to Python's include folder, usually \ - ${PYTHON_HOME}/include/python${PYTHON_VERSION}m -export NUMPY_INCLUDE=#path to numpy's include folder, usually \ - ${PYTHON_HOME}/lib/python${PYTHON_VERSION}/site-packages/numpy/core/include -gcc -shared -o libdistributions.so -fPIC distributions.c \ - -I${NUMPY_INCLUDE} -I${PYTHON_INCLUDE} -mv libdistributions.so ../../examples/numba/ - -On Windows - -rem PYTHON_HOME is setup dependent, this is an example -set PYTHON_HOME=c:\Anaconda -cl.exe /LD .\distributions.c -DDLL_EXPORT \ - -I%PYTHON_HOME%\lib\site-packages\numpy\core\include \ - -I%PYTHON_HOME%\include %PYTHON_HOME%\libs\python36.lib -move distributions.dll ../../examples/numba/ -""" -import os - -import numba as nb -import numpy as np -from cffi import FFI - -from numpy.random import PCG64 - -ffi = FFI() -if os.path.exists('./distributions.dll'): - lib = ffi.dlopen('./distributions.dll') -elif os.path.exists('./libdistributions.so'): - lib = ffi.dlopen('./libdistributions.so') -else: - raise RuntimeError('Required DLL/so file was not found.') - -ffi.cdef(""" -double random_gauss_zig(void *bitgen_state); -""") -x = PCG64() -xffi = x.cffi -bit_generator = xffi.bit_generator - -random_gauss_zig = lib.random_gauss_zig - - -def normals(n, bit_generator): - out = np.empty(n) - for i in range(n): - out[i] = random_gauss_zig(bit_generator) - return out - - -normalsj = nb.jit(normals, nopython=True) - -# Numba requires a memory address for void * -# Can also get address from x.ctypes.bit_generator.value -bit_generator_address = int(ffi.cast('uintptr_t', bit_generator)) - -norm = normalsj(1000, bit_generator_address) -print(norm[:12]) |