Dear Julia users, I am considering using Julia for computational projects. As a first to get a feeling of the new language a I tried to benchmark Julia speed against other popular languages. I used an example code from the Cython tutorial: http://docs.cython.org/src/tutorial/cython_tutorial.html [ the code for finding n first prime numbers].
Rewriting the code in different languages and measuring the times on my
Windows laptop gave me the following results:
Language | Time in seconds (less=better)
Python: 65.5
Cython (with MinGW): 0.82
Java : 0.64
Java (with -server option) : 0.64
C (with MinGW): 0.64
Julia (0.2): 2.1
Julia (0.3 nightly build): 2.1
All the codes for my experiments are attached to this post (Cython i Python
are both being run starting from the prim.py file)
The thing that worries me is that Julia takes much much longer than Cython
,,,
I am a beginner to Julia and would like to kindly ask what am I doing wrong
with my code.
I start Julia console and use the command include ("prime.jl") to execute
it.
This code looks very simple and I think the compiler should be able to
optimise it to at least the speed of Cython?
Maybe I my code has been written in non-Julia style way and the compiler
has problems with it?
I will be grateful for any answers or comments.
Best regards,
Przemyslaw Szufel
prime.jl
Description: Binary data
primes.pyx
Description: Binary data
import pyximport; pyximport.install(setup_args={'options': {'build_ext': {'compiler': 'mingw32'}}})
import primes
from timeit import timeit
def test1():
print(sum(primes.primes_list(20000)))
def test2():
p = [0]*20000
result = []
k = 0
n = 2
while k < 20000:
i = 0
while i < k and n % p[i] != 0:
i = i + 1
if i == k:
p[k] = n
k = k + 1
result.append(n)
n = n + 1
print(sum(result))
print("Cython:",timeit("test1()", setup="from __main__ import test1",number=1))
print("Python:",timeit("test2()", setup="from __main__ import test2",number=1))
print("Cython:",timeit("test1()", setup="from __main__ import test1",number=1))
print("Python:",timeit("test2()", setup="from __main__ import test2",number=1))
import java.util.ArrayList;
public class Primes {
static ArrayList<Integer> primes_list (int kmax) {
int n, k, i;
int p[] = new int[20000];
ArrayList<Integer> result = new ArrayList<>();
k = 0;
n = 2;
while (k < kmax) {
i = 0;
while (i < k && n % p[i] != 0) {
i = i + 1;
}
if (i == k) {
p[k] = n;
k = k + 1;
result.add(n);
}
n = n + 1;
}
return result;
}
public static void main(String[] args) {
long start;
int sum;
start = System.currentTimeMillis();
sum=0;
for (int s : primes_list(20000)) sum+=s;
System.out.println(sum);
System.out.println((System.currentTimeMillis()-start)/1000.0);
start = System.currentTimeMillis();
sum=0;
for (int s : primes_list(20000)) sum+=s;
System.out.println(sum);
System.out.println((System.currentTimeMillis()-start)/1000.0);
}
}
#include <stdio.h>
#include <time.h>
int main() {
int n, k, i;
int p[20000];
int result;
clock_t t1, t2;
t1 = clock();
k = 0;
n = 2;
result = 0;
while (k < 20000) {
i = 0;
while (i < k && n % p[i] != 0) {
i++;
}
if (i == k) {
p[k] = n;
k++;
result += n;
}
n++;
}
printf("result: %d\n", result);
t2 = clock();
float diff = (((float)t2 - (float)t1) / 1000000.0F ) * 1000;
printf("Time: %f\n",diff);
return 0;
}
