gpt4 book ai didi

list - Perl 列表插值性能

转载 作者:行者123 更新时间:2023-12-04 22:42:03 25 4
gpt4 key购买 nike

背景

Perldoc for List::Util表明 map 的某些用途可以替换为 reduce为了避免创建不必要的中间列表:

For example, to find the total length of the all the strings in a list, we could use

$total = sum map { length } @strings;

However, this produces a list of temporary integer values as long as the original list of strings, only to reduce it down to a single value again. We can compute the same result more efficiently by using reduce with a code block that accumulates lengths by writing this instead as:

$total = reduce { $a + length $b } 0, @strings;


那讲得通。然而, reduce为了在这个例子中工作需要“身份值”,这将被添加到输入列表中:
$total = reduce { $a + length $b } 0, @strings;
# ^^^^^^^^^^^

这让我觉得,不是 0, @strings创建一个新列表,从而抵消在 map 中不创建列表的任何 yield ?



列表如何插值 ($scalar, @list)在 Perl 工作?它涉及从源列表复制元素还是以某种更智能的方式完成?我的简单基准建议进行复制:
use strict;
use warnings;
use Benchmark qw/cmpthese/;

my @a1 = 1..10;
my @a2 = 1..100;
my @a3 = 1..1000;
my @a4 = 1..10000;
my @a5 = 1..100000;
my @a6 = 1..1000000;

cmpthese(10000, {
'a1' => sub { my @l = (0, @a1); },
'a2' => sub { my @l = (0, @a2); },
'a3' => sub { my @l = (0, @a3); },
'a4' => sub { my @l = (0, @a4); },
'a5' => sub { my @l = (0, @a5); },
'a6' => sub { my @l = (0, @a6); },
});

结果:
            (warning: too few iterations for a reliable count)
Rate a6 a5 a4 a3 a2 a1
a6 17.6/s -- -90% -99% -100% -100% -100%
a5 185/s 952% -- -90% -99% -100% -100%
a4 1855/s 10438% 902% -- -90% -99% -100%
a3 17857/s 101332% 9545% 862% -- -91% -98%
a2 200000/s 1135940% 107920% 10680% 1020% -- -80%
a1 1000000/s 5680100% 540000% 53800% 5500% 400% --

额外问题:如果我的假设是正确的(即 0, @strings 创建一个新列表),是否替换 mapreduce有道理?

最佳答案

doesn't 0, @strings create a new list



并不真地。如果您 decompile代码,它只是一个额外的 SVOP。

但是你测量的是错误的东西。这些值被展平并传递到 mapreduce两种情况下的子程序!

文档正在讨论子程序内部发生的事情。 map创建一个包含尽可能多的输入值的列表并返回它们,然后 sum获取列表并将其压缩为一个值。返回列表是短暂的,不直接在代码中表示。 (这个列表传递不是那么有效,它可以通过使用引用更快。)

相比之下,在 reduce ,没有这样的返回列表。 reduce仅适用于输入值列表并返回单个值。

关于list - Perl 列表插值性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45097597/

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