我正在为一个练习网站的问题解决方案并得到正确的答案。我在JavaScript / ES6(Node.js)中编写了我的解决方案,其执行时间约为870ms
。这是我写的代码:
console.time('runtime')
const isPrime = num => {
if (num < 0) return false
for (let i = 2, s = Math.sqrt(num); i <= s; i++)
if (num % i === 0) return false
return num !== 1
}
let sideLength = 7
let ratio = 100
let gap = 2
let progress = 1
let primes = 0
let count = 2
for (let i = 3; ratio >= 10; i += gap) {
const iRoot = Math.sqrt(i)
if (iRoot % 2 === 1) {
ratio = (primes / count) * 100
sideLength = iRoot
}
const curProgress = progress % 4
if (curProgress === 0)
gap += 2
progress++
if (isPrime(i))
primes++
count++
}
console.log(sideLength)
console.timeEnd('runtime')
作为对自己的挑战,我想在Python 3中重写相同的逻辑。我试图在两个程序之间尽可能地复制相同的逻辑。但是它的执行时间明显变慢了。大约19200ms
!比JavaScript版慢大约22倍!我最终将此作为Python 3版本的结果:
from math import sqrt
def is_prime(num):
if num < 0:
return False
s = sqrt(num)
for i in range(2, int(s) + 1):
if num % i == 0:
return False
return num != 1
side_length = 7
ratio = 100
gap = 2
progress = 1
primes = 0
count = 2
i = 3
while ratio >= 10:
root_i = sqrt(i)
if root_i % 2 == 1:
ratio = (primes / count) * 100
side_length = root_i
current_progress = progress % 4
if current_progress == 0:
gap += 2
progress += 1
if is_prime(i):
primes += 1
count += 1
i += gap
print(int(side_length))
我不确定我是否遗漏了一些非常明显的东西,或者在比较JavaScript和Python时,类似功能在后台的工作方式存在显着差异。任何帮助理解为什么会出现这种性能差异将非常感谢!谢谢!
请注意我如何衡量执行时间:
对于Python,我使用了magic function中的%timeit
iPython以及使用%run
从文件执行。
对于JavaScript版本,我使用console.time函数,将console.time('runtime')
和console.timeEnd('runtime')
分别放在文件的顶部和底部。