List Access
When you access an attribute of a list, it is much faster to target a reference to the list, or the list as a script property, than to target the list directly. It's not entirely clear why this is; it seems like a bug. But it's a venerable and acknowledged bug, because even Apple's earliest documentation on AppleScript contains an example illustrating this point.
In this code (based on Apple's example) we total the numbers in a long list:
set L to {}
set total to 0
set bignum to 5000
repeat with i from 1 to bignum
set end of L to i
end repeat
repeat with i from 1 to bignum
set total to total + (item i of L)
end repeat
total -- 12502500, and it takes about 22 seconds to run on my machineThe big slowdown here is the second repeat block, accessing items of the list. If we access these items by way of a reference to the list, things speed up dramatically:
set L to {}
set refL to a reference to L
set total to 0
set bignum to 5000
repeat with i from 1 to bignum
set end of L to i
end repeat
repeat with i from 1 to bignum
set total to total + (item i of refL)
end repeat
total -- 12502500, and it took less than a secondInstead of a reference, you can get the same extraordinary speed bump by referring to the list as a script property:
set L to {}
set total to 0
set bignum to 5000
repeat with i from 1 to bignum
set end of L to i
end repeat
repeat with i from 1 to bignum
set total to total + (item i of my L)
end repeat
total -- 12502500, and it took less than a secondThe magic word ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access