Когда вы сравниваете два фрагмента и просто заботитесь о производительности, цикл for более эффективен. Я не пробовал и сам тестировал, но вот общее описание различий.
В версии цикла for вы «посещаете» только первые 500 элементов списка. функция, переданная фильтру, всегда будет применяться ко всем элементам, выполняя дополнительную проверку для индекса элемента ниже 500.
Именно из-за того факта, что у вас есть больше элементов для проверки, в случае с фильтром нужно проделать большую работу.
Кроме того, при вызове функции на любом языке программирования взимается общая цена. То есть для обновления стека (в котором хранятся локальные переменные функции; переменные, видимые в вызывающей функции, не видны в вызываемой функции. Для этого используется стек). Цикл for остается в той же функции, поэтому область видимости локальных переменных не меняется, и стек не нужно обновлять.
Следовательно, с точки зрения производительности, цикл for является предпочтительным.
Тем не менее, лично я считаю, что более функциональный стиль (применение фильтра) более элегантен, его легче читать и поддерживать. Потребовались бы дополнительные настройки - например, чтобы создать представление исходного массива, чтобы не все элементы размером 10 тыс. Посещались. Я не буду вдаваться в подробности, так как это не оригинальный вопрос :)