Skip to content

Instantly share code, notes, and snippets.

@randyzwitch
Last active August 9, 2021 11:38
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save randyzwitch/6341926 to your computer and use it in GitHub Desktop.
Python vs. PyPy vs. Julia comparison - Factorials & Looping
#Python/pypy
import math
def smallestdivisall(n):
for i in xrange(1, math.factorial(n)+1):
for j in xrange(1, n+1):
if i % j != 0:
break
elif j == n:
return i
#IPython timer
In [1]: %time smallestdivisall(20)
#Python w/ Numba @autojit
import math
from numba import autojit
@autojit
def smallestdivisall(n):
for i in xrange(1, math.factorial(n)+1):
for j in xrange(1, n+1):
if i % j != 0:
break
elif j == n:
return i
#IPython timer
In [1]: %time smallestdivisall(20)
#Julia, 2nd run to remove compilation time
function smallestdivisall(n::Int64)
for i = 1:factorial(n)
for j = 1:n
if i % j !=0
break
elseif j == n
return i
end
end
end
end
#Julia time macro
julia> @time smallestdivisall(20)
#R
smallestdivisall <- function(n){
require("iterators") #Need because large values for n don't fit in vector, so use iterator
m <- icount(factorial(n))
i <- nextElem(m)
while(i < factorial(n)) {
for (j in 1:n) {
if (i %% j != 0) {
break
} else if (j == n) {
return(i)
}
}
i <- nextElem(m)
}
}
#R timer
system.time(smallestdivisall(20))
#Compile function to see speed up
library(compiler)
enableJIT(1)
smallestdivisall_c <- cmpfun(smallestdivisall)
#R timer
system.time(smallestdivisall_c(20))
@johnmyleswhite
Copy link

What values of n are you using in the Julia code? factorial(n) overflows very quickly.

@randyzwitch
Copy link
Author

The Julia function is only valid at n < 21 to avoid overflow, which is why my graphs are from 4 < n < 21

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment