При попытке вставить изображения я заметил, что Cases[]
очень медленный.
Чтобы воспроизвести, сначала скопируйте большое изображение в буфер обмена (просто нажмите Print Screen), затем оцените следующее:
In[33]:= SetSystemOptions["PackedArrayOptions" -> "UnpackMessage" -> True];
In[34]:= AbsoluteTiming[nb = [email protected][];]
Out[34]= {0.4687500, Null}
In[35]:= AbsoluteTiming[d1 = nb[[1, 1, 1, 1, 1, 1, 1]];]
Out[35]= {0., Null}
In[36]:= AbsoluteTiming[d2 = [email protected][nb, r_RasterBox :> First[r], Infinity, 1];]
During evaluation of In[36]:= Developer`FromPackedArray::unpack: Unpacking array in call to Notebook. >>
Out[36]= {0.9375000, Null}
(я сделал это в Windows, не уверен, что код вставки одинаковый для других систем.)
Обратите внимание, что извлечение данных с помощью Cases
происходит крайне медленно по сравнению с использованием Part
напрямую, хотя я явно указываю Cases
, что мне нужно только одно совпадение.
Я выяснил (как показано выше), что Cases
запускает распаковку по какой-либо причине, даже если поиск останавливается, прежде чем он достигнет упакованного массива внутри. Использование более мелкой спецификации уровня, чем Infinity
, может избежать распаковки.
Вопрос: Использование Cases
здесь проще и надежнее, чем Part
(что, если подвыражение может появляться в разных позициях?) Есть ли способ сделать Cases
быстро здесь, возможно, используя другой шаблон или различные варианты?
Возможно, связанный с этим вопрос: Неправильно оптимизирован шаблон Mathematica?
(Вот почему я изменил правило Cases
с RasterBox[data_, ___] -> data
на r_RasterBox :> First[r]
.)