Дорожная карта 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.