Commit 692abf58 authored by scoder's avatar scoder Committed by GitHub

Merge pull request #2353 from gabrieldemarmiesse/test_memory_allocation_1

Added tests for "memory allocation" Part 1
parents 3464b14e 1b964d5e
import random
from libc.stdlib cimport malloc, free
def random_noise(int number=1):
cdef int i
# allocate number * sizeof(double) bytes of memory
cdef double *my_array = <double *> malloc(number * sizeof(double))
if not my_array:
raise MemoryError()
try:
ran = random.normalvariate
for i in range(number):
my_array[i] = ran(0, 1)
return [x for x in my_array[:number]]
finally:
# return the previously allocated memory to the system
free(my_array)
...@@ -32,27 +32,18 @@ in cython from ``clibc.stdlib``. Their signatures are: ...@@ -32,27 +32,18 @@ in cython from ``clibc.stdlib``. Their signatures are:
void* realloc(void* ptr, size_t size) void* realloc(void* ptr, size_t size)
void free(void* ptr) void free(void* ptr)
A very simple example of malloc usage is the following:: A very simple example of malloc usage is the following:
import random .. literalinclude:: ../../examples/tutorial/memory_allocation/malloc.pyx
from libc.stdlib cimport malloc, free :linenos:
def random_noise(int number=1): .. note::
cdef int i
# allocate number * sizeof(double) bytes of memory Here we take Python doubles (with ``ran(0, 1)``) and convert
cdef double *my_array = <double *>malloc(number * sizeof(double)) them to C doubles when putting them in ``my_array``. After that,
if not my_array: we put them back into a Python list at line 19. So those C doubles
raise MemoryError() are converted again into Python doubles. This is highly inefficient,
and only for demo purposes.
try:
ran = random.normalvariate
for i in range(number):
my_array[i] = ran(0,1)
return [ my_array[i] for i in range(number) ]
finally:
# return the previously allocated memory to the system
free(my_array)
Note that the C-API functions for allocating memory on the Python heap Note that the C-API functions for allocating memory on the Python heap
are generally preferred over the low-level C functions above as the are generally preferred over the low-level C functions above as the
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment