Дорожная карта SciPy#

Эта страница дорожной карты содержит только самые важные идеи и потребности для SciPy в будущем. Для более подробной дорожной карты, включая статус по подпакетам, множество дополнительных идей, стабильность API и другое, см. Подробный план развития SciPy.

Поддержка распределенных массивов и массивов на GPU#

NumPy разделил свой API от механизма выполнения с __array_function__ и __array_ufunc__. Это позволит частям SciPy принимать распределённые массивы (например, dask.array.Array) и массивы GPU (например, cupy.ndarray), которые реализуют ndarray интерфейс. В настоящее время еще не ясно, какие алгоритмы будут работать из коробки, и есть ли значительные приросты производительности, когда они работают. Мы хотим создать карту того, какие части API SciPy работают, и улучшать поддержку со временем.

Помимо использования протоколов NumPy, таких как __array_function__, мы можем использовать эти протоколы и в SciPy. Это позволит (пере)реализовать функции SciPy, например, те, что в scipy.signal для Dask или GPU-массивов (см. NEP 18 - использование вне NumPy). Возможности NumPy в этой области все еще развиваются, см., например, NEP 37 - Протокол диспетчеризации для модулей, подобных NumPy, и SciPy является важным «клиентом» для этих функций.

Улучшения производительности#

Улучшения скорости, снижение использования памяти и возможность распараллеливания алгоритмов полезны для большинства научных областей и случаев использования. Мы установили шаблон проектирования API для многопроцессорной обработки - используя workers ключевое слово — которое может быть использовано во многих других функциях.

Упрощение для пользователей использования Numba @njit в их коде, который полагается на функциональность SciPy, может открыть значительный прирост производительности. Однако для этого нужна стратегия, все решения все еще находятся в стадии развития (см., например, этот обзор).

Наконец, многие отдельные функции могут быть оптимизированы для производительности. scipy.optimize и scipy.interpolate функции особенно часто запрашиваются в этом отношении.

Поддержка большего количества аппаратных платформ#

SciPy теперь имеет непрерывную интеграцию для ARM64 (или aarch64) и POWER8/9 (или ppc64le), а бинарные файлы доступны через Miniforge. Колеса на PyPI для этих платформ теперь также возможны (с manylinux2014 стандарт), и запросы на них становятся всё более частыми.

Кроме того, наличие IBM Z (или s390x) в CI теперь возможно с TravisCI, но ещё не реализовано - и manylinux2014 wheels для этой платформы также возможны. Наконец, решение открытых проблем сборки AIX поможет пользователям.

Реализовать разреженные массивы в дополнение к разреженным матрицам#

Разреженные матрицы SciPy заменяются разреженными массивами. Форматы разреженных матриц в основном завершены по функциональности, однако их основная проблема в том, что они ведут себя как numpy.matrix (который будет устаревшим в NumPy в какой-то момент). Нам нужна разреженная массивы которые ведут себя как numpy.ndarray (См. обсуждение на gh-18915). Разреженные массивы поддерживают все функции разреженных матриц, начиная с версии 1.15. В дополнение к 2D-массивам, 1D-разреженные массивы поддерживаются в форматах DOK, COO, CSR. Дополнительная функциональность, например, поддержка nD-массивов и вещание для некоторых операций, находится в разработке. Планы на будущее:

  • Расширить API разреженных массивов на nD массивы:
    • Форматы COO, CSR и DOK. Формат COO уже частично реализован.

    • Форматы nD используют 2D CSR-код для выполнения nD-операций, таких как индексирование/мин-макс/арифметика.

  • Бинарные операции с разреженными массивами будут поддерживать вещание в некоторых случаях. Вещание сложно для разреженных массивов, поскольку оно сильно опирается на страйдовую модель памяти плотных массивов и поэтому не всегда подходит для форматов разреженных данных. Наша оптимистичная цель — поддерживать вещание для всех операций, где это имеет смысл для структур разреженных данных. Мы начинаем с бинарных операций, таких как A + B.

  • Помощь другим библиотекам в переходе от разреженных матриц к разреженным массивам. Создание руководства по переходу и вспомогательных скриптов для пометки кода, требующего изменений.

  • Устаревание и последующее удаление «разреженной матрицы» в пользу «разреженного массива».

  • Работа с NumPy по устареванию/удалению numpy.matrix.