Рубрики
Без рубрики

Боа: Используйте функции Python в Node.js

Эй, все, на этот раз я в основном принесу тебе хорошую вещь. Его основная цель – позволить вам … Теги с узлом, JavaScript, Python.

Эй, все, на этот раз я в основном принесу тебе хорошую вещь. Его основная цель – позволить вам использовать интерфейсы Python и функции в Node.js. Может быть, вы будете любопытны, запутаны и озадачены, когда я вижу это здесь. Мой Node.js Magic такой хороший. Зачем использовать Python? Если вы пробовали некоторые приложения JavaScript для машинного обучения раньше, вы поймете причину этого.

Текущая ситуация состоит в том, что экосистема машины обучения почти привязана к Python. Язык итерация на высокой скорости, а JavaScript может рассчитывать только самостоятельно. Если мы ожидаем добиться текущего масштаба Python с нуля, объем требуемой работы огромна. Когда я писал Tensorflow-nodejs Несколько лет назад я уже так подумал.

Поэтому мы должны изменить наше мышление. Так как мы не можем превзойти Python, то будем использовать Python. Для разработчиков языков сценариев они на самом деле не заботятся о том, как реализован низкоуровневый слой, до тех пор, пока язык и интерфейс высокого уровня знакомы для меня, поэтому Боа Является ли библиотека Node.js, рожденная для этого, какие мосты Cpython Чтобы предоставить JavaScript с возможностью доступа к полной экосистеме Python, и, кроме того, с помощью новых функций ES6 для предоставления пользователям бесшовного опыта разработки, так что же опыт?

Давайте посмотрим на простой пример:

const boa = require('@pipcook/boa');  
const os = boa.import('os');  
console.log(os.getpid()); // prints the pid from python.  

// using keyword arguments namely \`kwargs\`  
os.makedirs('..', boa.kwargs({  
  mode: 0x777,  
  exist\_ok: false,  
}));  

// using bult-in functions  
const { range, len } = boa.builtins();  
const list = range(0, 10); // create a range array  
console.log(len(list)); // 10  
console.log(list\[2\]); // 2

Разве это не просто достаточно просто? Просто загрузите объект python через boa.import, а оставшийся доступ на объект, вызов функции и доступом на массиве не отличается от нашего JavaScript.

const boa = require('@pipcook/boa');  
const tf = boa.import('tensorflow');  
const { layers, Model } = tf.keras;

class TestModel extends Model {  
  constructor() {  
    super();  
    this.conv1 = layers.Conv2D(32, 3, boa.kwargs({ activation: 'relu' }));  
    this.flatten = layers.Flatten();  
    this.d1 = layers.Dense(128, boa.kwargs({ activation: 'relu' }));  
    this.d2 = layers.Dense(10, boa.kwargs({ activation: 'softmax' }));  
  }  
  call(x) {  
    return this.conv1(x)  
      .flatten(x)  
      .d1(x).d2(x);  
  }  
}

Приведенный выше пример показывает, как использовать Tensorflow для создания модели, в дополнение к демонстрации того, как наследовать из класса Python от JavaScript. Это очень хороший стиль JavaScript?

Стоит отметить, что в Боа Internals, нет инкапсуляции Tensorflow и других каркасов, если вы устанавливаете соответствующий пакет через Python локально, его можно использовать как приведенный выше код, поэтому в теории вы можете использовать любой пакет Python, который выполняется выше.

Далее мы представим некоторые основные методы отдельно.

Python построит некоторые общие функции в своих встроенных валютах, специфический список API находится на: https://docs.cython.org/3.7/library/functions.html, тогда Боа Также предоставляет соответствующий способ использовать их:

const { len, list, range } = boa.builtins();

В дополнение к встроенным методам, наиболее важной функцией является загрузка пакетов Python, поэтому импорт – это сделать.

const np = boa.import('numpy');

Далее – аргументы ключевых слов. В Python есть способ использовать карту для представления параметров, таких как:

foobar(100, x=10, y=20)

Это помогает абоненту понять значение каждого параметра лучше. По этой причине метод Kwargs был добавлен в BoA для поддержки этого использования:

foobar(100, boa.kwargs({ x: 10, y: 20 }));

«С» могут быть знакомы некоторыми людям, которые знакомы с историей JavaScript, но «с» в Python, его использование и цель не совпадают с JavaScript. С оператор в Python немного похоже на блокировку Scoping в JavaScript:

with(localcontext()) {  
  \# balabala  
}

Приведенный выше код сохраняет состояние localcontext (), затем начинает выполнять код блока в с помощью оператора, и, наконец, выпускает состояние localcontext ().

Механизм внутреннего внедрения заключается в том, что каждая переменная, передаваемая в счет, необходимо для реализации двух магических методов: __enter__ и __exit__, а затем вызывается до и после выполнения блока.

Последнее, чтобы сказать, это оценить выражения Python (одна строка). Почему мы должны предоставить такой метод? Это все еще должно говорить о преимуществах Python. В некоторых очень сложных сценариях обработки данных выражения Python все еще могут быть выражены очень просто и понятно, что значительно снижает сложность кода. Давайте посмотрим на пример:

const line = (boa.eval\`'\\t'.join(\[str(x) for x in ${vec}\])\`);

Если вышеуказанный код должен быть заменен JavaScript:

vec.map(x => x.toString()).join('\\t');

Сколько кажется, почти правильно? Затем взгляните на следующий пример:

boa.eval\`{u:i for i, u in enumerate(${vocab})}\`;  
boa.eval\`\[${char2idx}\[c\] for c in ${text}\]\`  
boa.eval\`${chunk}\[:-1\]\`  
boa.eval\`${chunk}\[0:-1:2\]\`

Как насчет этого, хочется ли он, похоже на вышеприведенный пример, не может быть сделан с простой линией JavaScript?

Однако стоит упомянуть, что JavaScript постепенно составляет в этом отношении. Существуют некоторые связанные стандарты, которые делают TC39, в том числе вышеупомянутое обозначение среза.

Говоря о возвращении в Eval, это как дополнение к JavaScript. До того, как некоторые стандарты были реализованы и стабилизированы, это позволяет нам использовать выражения Python, чтобы выразить более просто, и все, что нам нужно, это немного недорогих обучения. Вот и все.

Далее давайте поговорим о том, как используется Eval. Он принимает «строку», но мы обычно передаем строку шаблона при использовании ее. Давайте сначала посмотрим на два примера:

boa.eval('print("foobar")');  
boa.eval(\`print("${txt}")\`);

После прочтения вышеуказанных 2 строк кода они являются относительно редкими использованием. Наиболее часто используемое и наиболее эффективное Eval – это использование мечего шаблона. Это использование похоже на то, что мы видели в начале. Содержание строки шаблона напрямую следует Eval. Преимущество этого заключается в том, что функция EVAL получит ко всем параметрам шаблона, чтобы мы могли открыть объекты JavaScript и выражения Python для достижения более плавного пользовательского опыта, следующим образом:

const chunk = range(0, 10);  
boa.eval\`${chunk}\[0:-1:2\]\`;

Приведенное выше состоит в том, чтобы перенести кусок на выражение, а затем получить соответствующее значение через синтаксис нарезания нарезки Python и, наконец, вернуться в мир JavaScript.

Ну, простое введение API придет сюда сначала. Если вы хотите узнать больше о API и Боа , вы можете пойти в нашу документацию: https://github.com/alibaba/pipcook/blob/master/docs/tutorials/want-to-use-python.md Отказ

Кроме того, как подпроект Pipcook, Боа Также очень хочет присоединиться. Для тех, кто хочет присоединиться, вы можете использовать эти проблемы как хорошее начало: https://github.com/alibaba/pipcook/issuesues?=is%3aissue+is%3aOpen+label%3a%22good++first+issue%22 Отказ

Наконец, давайте поговорим об первоначальном намерении Боа , что должно разрешить разработчикам Node.js использовать богатую экосистему богатого машины Python. Можно сказать, что начать сегодня, вы можете начать смотреть на документацию Python и использовать JavaScript для «Узнать и использовать» Машинное обучение и глубокое обучение!

Оригинал: “https://dev.to/yorkie/boa-use-python-functions-in-node-js-8mh”