gpt4 book ai didi

python - 我如何对 Python 与 Clojure 的性能进行基准测试(比较)?

转载 作者:行者123 更新时间:2023-11-28 21:06:49 25 4
gpt4 key购买 nike

我正在学习 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com