Vitesse sage je ne suis pas si sûr. Voici un exemple rapide: j'ai créé une fonction(de x) qui retourne une liste de nombres premiers entre 2 et x:
-
régulier de la fonction python à l'aide de listes:
def findprimeupto(x):
primes = []
n_primes = []
for i in range(2, x):
if not (i in n_primes):
primes.append(i)
n_primes.append(i)
for j in range(len(primes)):
if i > n_primes[j]:
n_primes[j] += primes[j]
return primes
import time
start_time = time.time()
findprimeupto(10000)
print("--- %s seconds ---" % str(time.time() - start_time))
-
et C comme fonction python à l'aide de tableaux numpy:
import numpy
def findprimeupto(x):
primes = numpy.array(numpy.zeros(x), dtype=numpy.int32)
n_primes = numpy.array(numpy.zeros(x), dtype=numpy.int32)
primeslen = 0
for i in range(2, x):
flag = 1
for j in range(primeslen):
if n_primes[j] == i:
flag = 0
break
if flag:
primes[primeslen] = i
n_primes[primeslen] = i
primeslen += 1
for j in range(primeslen):
if i > n_primes[j]:
n_primes[j] += primes[j]
return [primeslen, primes]
import time
start_time = time.time()
result = findprimeupto(10000)
#for i in range(result[0]):
# print('{:d} '.format(result[1][i]), end="")
print()
print("--- %s seconds ---" % str(time.time() - start_time))
L'ancien, soi-disant lenteur de mise en œuvre à l'aide de listes, est exécuté en 0,6 seconde et la plus tard, soi-disant rapide numpy mise en œuvre, les besoins en 50 secondes. Si quelqu'un peut rappeler pourquoi je serais très heureux.
BTW pur programme C qui est plus ou moins une copie de numpy version de la fonction s'exécute en moins de 0,04 s. La vitesse de C est encore plus évident avec grand x:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void findprimesupto(int n, int *primeslen, int *primes, int *n_primes) {
int i, j, flag;
*primeslen = 0;
for (i=2; i <= n; i++) {
for (j=0, flag=1; j < *primeslen; j++)
if (n_primes[j] == i) {
flag = 0;
break;
}
if (flag) {
primes[*primeslen] = i;
n_primes[*primeslen] = i;
(*primeslen)++;
}
for (j=0; j < *primeslen; j++)
if (i > n_primes[j])
n_primes[j] += primes[j];
}
}
int main() {
int n = 10000, primeslen = 0, i;
int *primes, *n_primes;
clock_t start, diff;
start = clock();
primes = malloc(n * sizeof(int));
n_primes = malloc(n * sizeof(int));
findprimesupto(n, &primeslen, primes, n_primes);
/* for (i=0; i < primeslen; i++)
printf("%d ", primes[i]);
printf("\n");
*/
diff = clock() - start;
printf("Time: %f s\n", (float) diff / (float) CLOCKS_PER_SEC);
free(primes);
free(n_primes);
return 0;
}