summaryrefslogtreecommitdiff
path: root/docs/examples/tutorial/memory_allocation/malloc.py
diff options
context:
space:
mode:
author0dminnimda <0dminnimda@gmail.com>2021-08-08 11:30:07 +0300
committerGitHub <noreply@github.com>2021-08-08 10:30:07 +0200
commit3a0ca192ed497f81c7bee60f13f635c9ac265e72 (patch)
tree681ea6e4a36299c47bd0ebe2ac40f38cda761481 /docs/examples/tutorial/memory_allocation/malloc.py
parentec8c0804f1a847e7f9b92210d756507afb6ae9b3 (diff)
downloadcython-3a0ca192ed497f81c7bee60f13f635c9ac265e72.tar.gz
docs: Pythonise documentation on Memory Allocation (memory_allocation.rst) (GH-4316)
Diffstat (limited to 'docs/examples/tutorial/memory_allocation/malloc.py')
-rw-r--r--docs/examples/tutorial/memory_allocation/malloc.py24
1 files changed, 24 insertions, 0 deletions
diff --git a/docs/examples/tutorial/memory_allocation/malloc.py b/docs/examples/tutorial/memory_allocation/malloc.py
new file mode 100644
index 000000000..fb7e82236
--- /dev/null
+++ b/docs/examples/tutorial/memory_allocation/malloc.py
@@ -0,0 +1,24 @@
+import random
+from cython.cimports.libc.stdlib import malloc, free
+
+def random_noise(number: cython.int = 1):
+ i: cython.int
+ # allocate number * sizeof(double) bytes of memory
+ my_array: cython.p_double = cython.cast(cython.p_double, malloc(
+ number * cython.sizeof(cython.double)))
+ if not my_array:
+ raise MemoryError()
+
+ try:
+ ran = random.normalvariate
+ for i in range(number):
+ my_array[i] = ran(0, 1)
+
+ # ... let's just assume we do some more heavy C calculations here to make up
+ # for the work that it takes to pack the C double values into Python float
+ # objects below, right after throwing away the existing objects above.
+
+ return [x for x in my_array[:number]]
+ finally:
+ # return the previously allocated memory to the system
+ free(my_array)