gpt4 book ai didi

python-3.x - 有没有办法加快这个功能?

转载 作者:行者123 更新时间:2023-12-04 23:23:38 24 4
gpt4 key购买 nike

我正在比较这个 F# 函数的性能:

let e28 N =                               
seq {for i in 2L..2L..N do for j in 1..4 -> i} |> Seq.scan (+) 1L |> Seq.sum

使用 Python 3.3 等效项:
def e28a(N = 100000):
diagNumber = 1
sum = diagNumber
for width in range(2, N+1, 2):
for j in range(4):
diagNumber += width
sum += diagNumber
return sum

import itertools as it
def e28b(N = 100000):
return sum(it.accumulate(it.chain([1], (i for i in range(2, N+1, 2) for j in range(4)))))

import numpy as np
def e28c(N = 100000):
return np.sum(np.cumsum(np.fromiter(chain([1], (i for i in range(2, N+1, 2) for j in range(4))), np.int64)))

我在 Windows 7 上获得 64 位 CPython 3.3.1 的性能比 C++ 慢 574 倍。以下是 N = 100000 的时间:

e28:23ms; e28a:48.4ms; e28b:49.7ms; e28c:40.2ms; C++ 版本:0.07ms

在不改变底层算法的情况下优化 Python 代码是否有一个容易实现的目标?

最佳答案

F# 版本可以通过切换到程序化、可变的方法(比如你的 python e28a)来加速约 10 倍。当“有效载荷操作”(在这种情况下,只是 +)如此微不足道时,组合器的使用最终会增加相对显着的开销。作为旁注,Seq.sum使用检查算法,这也增加了一些开销。

F# 的好处之一是,如果需要性能关键的热路径,您可以回退到过程/可变样式。

let e28_original N =
seq {
for i in 2UL..2UL..N do
for j in 1..4 do
yield i
}
|> Seq.scan (+) 1UL
|> Seq.sum

let e28_mutable N =
let mutable sum = 1UL
let mutable total = sum
for i in 2UL..2UL..N do
for j in 1..4 do
sum <- sum + i
total <- total + sum
total

let time f =
f () |> ignore // allow for warmup / JIT
let sw = System.Diagnostics.Stopwatch.StartNew()
let result = f ()
sw.Stop()
printfn "Result: %A Elapsed: %A" result sw.Elapsed

time (fun _ -> e28_original 100000UL)
time (fun _ -> e28_mutable 100000UL)

结果
Result: 666691667100001UL Elapsed: 00:00:00.0429414
Result: 666691667100001UL Elapsed: 00:00:00.0034971

关于python-3.x - 有没有办法加快这个功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17486574/

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