При попытке вставить изображения я заметил, что Cases []
очень медленный.
Для воспроизведения сначала скопируйте большое изображение в буфер обмена (просто нажмите Print Screen ), затем оцените следующее:
In[33]:= SetSystemOptions["PackedArrayOptions" -> "UnpackMessage" -> True];
In[34]:= AbsoluteTiming[nb = NotebookGet@ClipboardNotebook[];]
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 = First@Cases[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
здесь проще и надежнее, чем Часть
(что, если подвыражение может появляться в разных позициях?) Есть ли способ сделать Здесь дела
работают быстро, возможно, используя другой шаблон или другие параметры?
Возможно связанный вопрос: Сопоставление с образцом в системе Mathematica плохо оптимизировано?
(Вот почему я изменил правило Cases
с RasterBox [data_, ___] -> data
на r_RasterBox:> First [r]
.)