2017-01-25 31 views
0

Я пытаюсь проверить, какие треки находятся в моем каталоге библиотеки iTunes и которые не используют AppleScript.Applescript - Плохая производительность, итерация всех треков iTunes в библиотеке

Следующий сценарий действительно медленно занимает около 2 секунд для каждого трека (есть около 8000 треков в библиотеке):

#!/usr/bin/osascript 
tell application "iTunes" 

     repeat with l in (location of every file track) 
       set fileName to (POSIX path of l) 
       if fileName does not start with "/Users/user/Music/iTunes/iTunes Media/" then 
         log fileName 
       end if 
     end repeat 

end tell 

также попытался следующие, но такую ​​же производительность:

#!/usr/bin/osascript 
tell application "iTunes" 

     repeat with l in (location of every file track) 
       POSIX path of l does not start with "/Users/user/Music/iTunes/iTunes Media/" 
     end repeat 

end tell 

Между тем iTunes становится довольно невосприимчивым.

Должно быть, что-то глупое, но не могу понять, что.

Это находится под OS X El Capitan на 27-летнем iMac 2015 года.

Любая помощь приветствуется.

Приветствия

ответ

0

Вы можете значительно ускорить сценарий с помощью ключевого слова get

repeat with l in (get location of every file track) 

Разница заключается в том:

  • без get список извлекается в каждой итерации
  • с get список извлекается один раз
+0

Пятно на! благодаря – user1905449

0

Две проблемы:

  1. Отправка много событий Apple, стоит дорого. repeat with l in (location of every file track) отправляет отдельное событие get для каждого трека (get location of file track 1, get location of file track 2, ...). Сначала получите список всех местоположений, а затем перейдите по нему.

  2. Из-за дрянной реализации время, необходимое для получения элемента списка AppleScript, линейно увеличивается с длиной списка; таким образом, производительность при переходе больших списков идет в бак (O(n*n) вместо O(n) эффективности). Вы можете свести его до O(n) с неприятным взломом, ссылаясь на элементы списка через ссылку (например, приклеивая список в свойстве объекта сценария, а затем ссылаясь на это).

Пример:

set iTunesFolder to POSIX path of (path to music folder) & "iTunes/iTunes Media/" 

tell application "iTunes" 
    script 
     property fileLocations : location of every file track 
    end script 
end tell 
repeat with l in fileLocations of result 
    set fileName to (POSIX path of l) 
    if fileName does not start with iTunesFolder then log fileName 
end repeat 

 Смежные вопросы

  • Нет связанных вопросов^_^