Allen,
Om de vrijdag middag eens 'nuttig' in te vullen, ben ik eens de snelheid van een aantal veel gebruikte programmeertalen gaan vergelijken, door middel van een 'priemgetal' scriptje. De resultaten van vooral python zijn opvallend en ik vraag me af of ik iets fout doe. De code:
Om vervolgens goed de snelheid te testen gebruik ik hiervoor time:
Op zich valt het me niet zo op dat Java veel sneller is; aangezien deze code gecompileerd is. Maar vooral het verschil tussen PHP/Perl en Python is enorm.
Kan iemand verklaren waarom Python 2x zo lang over het berekenen doet?
Om de vrijdag middag eens 'nuttig' in te vullen, ben ik eens de snelheid van een aantal veel gebruikte programmeertalen gaan vergelijken, door middel van een 'priemgetal' scriptje. De resultaten van vooral python zijn opvallend en ik vraag me af of ik iets fout doe. De code:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
| public class Prime { public void calculatePrimeNumbers() { int i = 0; int primeNumberCounter = 0; while (++i <= 100000) { int i1 = (int) Math.ceil(Math.sqrt(i)); boolean isPrimeNumber = false; while (i1 > 1) { if ((i != i1) && (i % i1 == 0)) { isPrimeNumber = false; break; } else if (!isPrimeNumber) { isPrimeNumber = true; } --i1; } if (isPrimeNumber) { ++primeNumberCounter; } } System.out.println("Nr of prime numbers found: " + primeNumberCounter); } /** * @param args the command line arguments */ public static void main(String[] args) { new Prime().calculatePrimeNumbers(); } } |
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| <? $i = 1; $count = 0; while ( ++$i <= 100000 ) { $n = ceil(sqrt($i)); $isPrime = 0; while( $n > 1 ) { if ( ( $i != $n ) && ( $i % $n == 0 ) ) { $isPrime = 0; break; } elseif( $isPrime == 0 ) { $isPrime = 1; } --$n; } if ( $isPrime == 1 ) { $count++; } } print "Nr of prime numbers found: $count\n"; ?> |
Perl:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| #! /usr/bin/perl -w use strict; use POSIX; my ( $i ) = 1; my ( $count ) = 0; while ( ++$i <= 100000 ) { my ( $n ) = ceil(sqrt($i)); my ( $isPrime ) = 0; while( $n > 1 ) { if ( ( $i != $n ) && ( $i % $n == 0 ) ) { $isPrime = 0; last; } elsif( $isPrime == 0 ) { $isPrime = 1; } --$n; } if ( $isPrime == 1 ) { $count++; } } print "Nr of prime numbers found: $count\n"; |
Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| import math i = 0 count = 0 for i in range( 2, 100000 ): n = math.ceil(math.sqrt(i)) isPrime = 0 while( n > 1 ): if ( ( i != n ) & ( i % n == 0 ) ): isPrime = 0 break elif( isPrime == 0 ): isPrime = 1 n -= 1 if ( isPrime == 1 ): count += 1 print "Nr of prime numbers found:", count, "\n" |
Om vervolgens goed de snelheid te testen gebruik ik hiervoor time:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
| quexy@arachnid:~/prime$ time java Prime Nr of prime numbers found: 9592 real 0m0.426s user 0m0.372s sys 0m0.028s ---- quexy@arachnid:~/prime$ time php Prime.php Nr of prime numbers found: 9592 real 0m6.162s user 0m6.156s sys 0m0.008s ---- quexy@arachnid:~/prime$ time perl Prime.pl Nr of prime numbers found: 9592 real 0m7.171s user 0m7.160s sys 0m0.012s ---- quexy@arachnid:~/prime$ time python Prime.py Nr of prime numbers found: 9592 real 0m15.556s user 0m15.005s sys 0m0.012s |
Op zich valt het me niet zo op dat Java veel sneller is; aangezien deze code gecompileerd is. Maar vooral het verschil tussen PHP/Perl en Python is enorm.
Kan iemand verklaren waarom Python 2x zo lang over het berekenen doet?