summaryrefslogtreecommitdiff
path: root/docs/examples/tutorial/cython_tutorial
diff options
context:
space:
mode:
Diffstat (limited to 'docs/examples/tutorial/cython_tutorial')
-rw-r--r--docs/examples/tutorial/cython_tutorial/primes.py27
-rw-r--r--docs/examples/tutorial/cython_tutorial/primes.pyx10
-rw-r--r--docs/examples/tutorial/cython_tutorial/primes_cpp.py22
-rw-r--r--docs/examples/tutorial/cython_tutorial/primes_cpp.pyx43
-rw-r--r--docs/examples/tutorial/cython_tutorial/primes_python.py2
-rw-r--r--docs/examples/tutorial/cython_tutorial/setup.py6
6 files changed, 79 insertions, 31 deletions
diff --git a/docs/examples/tutorial/cython_tutorial/primes.py b/docs/examples/tutorial/cython_tutorial/primes.py
new file mode 100644
index 000000000..645d9479d
--- /dev/null
+++ b/docs/examples/tutorial/cython_tutorial/primes.py
@@ -0,0 +1,27 @@
+def primes(nb_primes: cython.int):
+ i: cython.int
+ p: cython.int[1000]
+
+ if nb_primes > 1000:
+ nb_primes = 1000
+
+ if not cython.compiled: # Only if regular Python is running
+ p = [0] * 1000 # Make p work almost like a C array
+
+ len_p: cython.int = 0 # The current number of elements in p.
+ n: cython.int = 2
+ while len_p < nb_primes:
+ # Is n prime?
+ for i in p[:len_p]:
+ if n % i == 0:
+ break
+
+ # If no break occurred in the loop, we have a prime.
+ else:
+ p[len_p] = n
+ len_p += 1
+ n += 1
+
+ # Let's copy the result into a Python list:
+ result_as_list = [prime for prime in p[:len_p]]
+ return result_as_list
diff --git a/docs/examples/tutorial/cython_tutorial/primes.pyx b/docs/examples/tutorial/cython_tutorial/primes.pyx
index 96ecdb59a..7707e30dc 100644
--- a/docs/examples/tutorial/cython_tutorial/primes.pyx
+++ b/docs/examples/tutorial/cython_tutorial/primes.pyx
@@ -1,9 +1,13 @@
def primes(int nb_primes):
cdef int n, i, len_p
- cdef int p[1000]
+ cdef int[1000] p
+
if nb_primes > 1000:
nb_primes = 1000
+
+
+
len_p = 0 # The current number of elements in p.
n = 2
while len_p < nb_primes:
@@ -18,6 +22,6 @@ def primes(int nb_primes):
len_p += 1
n += 1
- # Let's return the result in a python list:
- result_as_list = [prime for prime in p[:len_p]]
+ # Let's copy the result into a Python list:
+ result_as_list = [prime for prime in p[:len_p]]
return result_as_list
diff --git a/docs/examples/tutorial/cython_tutorial/primes_cpp.py b/docs/examples/tutorial/cython_tutorial/primes_cpp.py
new file mode 100644
index 000000000..468d00c46
--- /dev/null
+++ b/docs/examples/tutorial/cython_tutorial/primes_cpp.py
@@ -0,0 +1,22 @@
+# distutils: language=c++
+
+import cython
+from cython.cimports.libcpp.vector import vector
+
+def primes(nb_primes: cython.uint):
+ i: cython.int
+ p: vector[cython.int]
+ p.reserve(nb_primes) # allocate memory for 'nb_primes' elements.
+
+ n: cython.int = 2
+ while p.size() < nb_primes: # size() for vectors is similar to len()
+ for i in p:
+ if n % i == 0:
+ break
+ else:
+ p.push_back(n) # push_back is similar to append()
+ n += 1
+
+ # If possible, C values and C++ objects are automatically
+ # converted to Python objects at need.
+ return p # so here, the vector will be copied into a Python list.
diff --git a/docs/examples/tutorial/cython_tutorial/primes_cpp.pyx b/docs/examples/tutorial/cython_tutorial/primes_cpp.pyx
index 57bfe9cc2..afef8bd13 100644
--- a/docs/examples/tutorial/cython_tutorial/primes_cpp.pyx
+++ b/docs/examples/tutorial/cython_tutorial/primes_cpp.pyx
@@ -1,21 +1,22 @@
-# distutils: language=c++
-
-from libcpp.vector cimport vector
-
-def primes(unsigned int nb_primes):
- cdef int n, i
- cdef vector[int] p
- p.reserve(nb_primes) # allocate memory for 'nb_primes' elements.
-
- n = 2
- while p.size() < nb_primes: # size() for vectors is similar to len()
- for i in p:
- if n % i == 0:
- break
- else:
- p.push_back(n) # push_back is similar to append()
- n += 1
-
- # Vectors are automatically converted to Python
- # lists when converted to Python objects.
- return p
+# distutils: language=c++
+
+
+from libcpp.vector cimport vector
+
+def primes(unsigned int nb_primes):
+ cdef int n, i
+ cdef vector[int] p
+ p.reserve(nb_primes) # allocate memory for 'nb_primes' elements.
+
+ n = 2
+ while p.size() < nb_primes: # size() for vectors is similar to len()
+ for i in p:
+ if n % i == 0:
+ break
+ else:
+ p.push_back(n) # push_back is similar to append()
+ n += 1
+
+ # If possible, C values and C++ objects are automatically
+ # converted to Python objects at need.
+ return p # so here, the vector will be copied into a Python list.
diff --git a/docs/examples/tutorial/cython_tutorial/primes_python.py b/docs/examples/tutorial/cython_tutorial/primes_python.py
index f6559d519..845af5bbf 100644
--- a/docs/examples/tutorial/cython_tutorial/primes_python.py
+++ b/docs/examples/tutorial/cython_tutorial/primes_python.py
@@ -1,4 +1,4 @@
-def primes_python(nb_primes):
+def primes(nb_primes):
p = []
n = 2
while len(p) < nb_primes:
diff --git a/docs/examples/tutorial/cython_tutorial/setup.py b/docs/examples/tutorial/cython_tutorial/setup.py
deleted file mode 100644
index 302a08e5f..000000000
--- a/docs/examples/tutorial/cython_tutorial/setup.py
+++ /dev/null
@@ -1,6 +0,0 @@
-from distutils.core import setup
-from Cython.Build import cythonize
-
-setup(
- ext_modules=cythonize("fib.pyx"),
-)