summaryrefslogtreecommitdiff
path: root/docs/examples/tutorial/memory_allocation/malloc.py
diff options
context:
space:
mode:
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)