- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在学习 Clojure,为了更好地掌握我的进步,我决定开始用该语言解决 Project Euler 问题(其中一些问题我已经用 C++ 和 Python 解决了)。问题 1 如下:
If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.
Find the sum of all the multiples of 3 or 5 below 1000.
这是我第一次使用 Clojure 解决方案:
(defn main1
([n]
(reduce +
(filter
#(or
(= 0 (mod % 3))
(= 0 (mod % 5)))
(range n)))))
然后我查看了我的Python版本的代码,如下:
import sys
import operator
from functools import reduce
def main(n=1000):
"""
returns solution up to but excluding n
"""
genexp = (num for num in range(1, n) if ((num % 3 == 0) or (num % 5 == 0)))
total = reduce(operator.add, genexp)
return total
if __name__ == "__main__":
if len(sys.argv) > 1:
print(main(int(sys.argv[1])))
else:
print(main())
忽略我在 Python 版本中添加的额外 CLI-args 内容,唯一的主要区别是我在 Clojure 中使用了 filter
而不是生成器。我想我也可以在 Python 中使用 filter
,但只是为了争论,我让我的 Clojure 代码更类似于 Python 代码:
(defn main2
([n]
(reduce + (for [i (range n)
:let [div3 (= 0 (mod i 3))
div5 (= 0 (mod i 5))]
:when (or div3 div5)]
i))))
这让我开始思考 - 如何对这些函数进行基准测试以进行比较?对于 Python,这很简单:
$ time python python/p0001.py 10000000
23333331666668
real 0m2.693s
user 0m2.660s
sys 0m0.018s
$ time python python/p0001.py 100000000
2333333316666668
real 0m26.494s
user 0m26.381s
sys 0m0.050s
它在合理的时间内(不到 30 秒)上升到 n=100,000,000
。如何为我的 Clojure 函数运行类似的测试?我想在运行之前我必须先编译 Clojure 代码。考虑到此处的 Python 代码不是 JIT 编译的,这甚至是一个公平的比较吗?
另一方面,我的 Clojure 代码(两个版本)有多地道?有哪些关于代码样式的好的建议?是否有类似 pep8 的风格指南?或者甚至是类似于 Clojure 版本的 pep20:“Python 之禅”?
最佳答案
内置函数 time
适合第一次切割:
(time (main1 100000000)) => 2333333316666668
"Elapsed time: 15824.041487 msecs"
您还可以使用 the excellent criterium
library
(ns xyz.core
(:require [criterium.core :as cc] ))
(cc/quick-bench (main1 999))
Evaluation count : 3894 in 6 samples of 649 calls.
Execution time mean : 154.680082 µs
Execution time std-deviation : 750.591607 ns
Execution time lower quantile : 153.982498 µs ( 2.5%)
Execution time upper quantile : 155.870826 µs (97.5%)
Overhead used : 7.898724 ns
Found 1 outliers in 6 samples (16.6667 %)
low-severe 1 (16.6667 %)
Variance from outliers : 13.8889 % Variance is moderately inflated by outliers
关于python - 我如何对 Python 与 Clojure 的性能进行基准测试(比较)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42265944/
我是一名优秀的程序员,十分优秀!