AppleScript文档建议使用以下代码来有效地构建列表:
set bigList to {}
set bigListRef to a reference to bigList
set numItems to 100000
set t to (time of (current date)) --Start timing operations
repeat with n from 1 to numItems
copy n to the end of bigListRef
end
set total to (time of (current date)) - t --End timing
请注意使用显式引用。这在脚本的顶层或显式的运行处理程序中工作正常,但如果你在另一个处理程序中逐字地运行相同的完全代码,如下所示:
on buildList()
set bigList to {}
set bigListRef to a reference to bigList
set numItems to 100000
set t to (time of (current date)) --Start timing operations
repeat with n from 1 to numItems
copy n to the end of bigListRef
end
set total to (time of (current date)) - t --End timing
end buildList
buildList()
它中断,产生一条错误消息,“无法将bigList变为类型引用”。为什么这会破坏,以及在run()以外的处理程序中有效构建列表的正确方法是什么?
答案 0 :(得分:1)
set end of l to i
似乎比copy i to end of l
更快:
on f()
set l to {}
repeat with i from 1 to 100000
set end of l to i
end repeat
l
end f
set t to time of (current date)
set l to f()
(time of (current date)) - t
您还可以使用脚本对象:
on f()
script s
property l : {}
end script
repeat with i from 1 to 100000
copy i to end of l of s
end repeat
l of s
end f
set t to time of (current date)
set l to f()
(time of (current date)) - t
100000也超过limit of items that can be saved in compiled scripts,因此如果您运行脚本并尝试将其另存为scpt,则会出现如下错误:
文档“无标题”无法保存为“Untitled.scpt”。
您可以将set l to f()
置于处理程序中,以便l是本地的,将set l to {}
添加到结尾,或将脚本保存为.applescript。
答案 1 :(得分:1)
以下是我之前做过的速度测试的结果和方法。请注意,每个试验的第一个结果都较慢,因为以前没有编译过脚本。
答案 2 :(得分:1)
将“global bigList”添加到buildList()的第一行可以修复编译器错误。似乎在运行处理程序中,默认情况下变量是裸的,并且“引用”运算符很有用。但是,在其他情况下,变量本质上已经是间接引用,并且创建另一个参考层会破坏内容。在这些上下文中声明一个全局变量会剥离间接引用并允许“引用”运算符工作,但这是不必要的。只需使用默认的间接引用。
如果不清楚,那是因为我不完全理解这种机制。如果你能更好地掌握这里发生的事情,请在下面评论。