gpt4 book ai didi

performance - 我如何有效地(内存/时间)修改 Tcl 中列表的所有元素?

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

要对列表的每个元素进行操作,返回修改后的列表,各种语言都有显式结构。

在 Perl 中有 map :

perl -e 'my @a = (1..4); print join(q( ), map { $_ * $_ } @a)'
1 4 9 16

在 Python 中有列表推导式:
>>> a = (1,2,3,4)
>>> [el*el for el in a]
[1, 4, 9, 16]

在 Tcl 中执行此操作的最有效方法是什么?
我可以想出通常的 foreach 循环。
set l {}
foreach i {1 2 3 4} {
lappend l [expr $i * $i]
}
puts $l
1 4 9 16

这是最快的方法吗?

关于内存效率,这将一个一个地建立第二个列表。如果我永久不需要该列表,是否有更有效的方法?

最后,有没有更短的东西?
我在此处或 http://wiki.tcl.tk 中找不到信息

回答:

正如 Donal Fellows 所回答的,对于速度测试最重要的是,应该将事情包装在 proc {} 中,因为 Tcl 可以优化。对于 Tcl,“ map ”功能被讨论为 future 的增强。有了这个提示并进一步搜索,我找到了 http://wiki.tcl.tk/12848

最佳答案

最有效的方法是这样的:

set idx 0
foreach item $theList {
lset theList $idx [expr {$item * $item}]
incr idx
}

如果列表很短(例如,几百个元素),则分配新列表的成本很小,因此您可以改用这个(更简单的)版本:
foreach item $theList {
lappend newList [expr {$item * $item}]
}

请注意 foreach命令只有放在过程(或 lambda 表达式或方法)中才快,表达式只有放在 { 中才快牙套 } .另外, 不要猜测,测量 : 注意使用 time命令来找出你的代码到底有多快。

关于performance - 我如何有效地(内存/时间)修改 Tcl 中列表的所有元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7723342/

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