brunch

Python을 JS 파일에서?

#pyodide, #웹어셈블리, #WebAssembly

by 유윤식

왜 자바스크립트에서 파이썬을 사용할까?


그건 나도 모른다.


근데,

사용할 수 있다. 그럼 파이썬의 장점을 살릴 수 있다는 뜻인데.


https://pyodide.org/en/stable/

웹어셈블리 라는 워드를 근래에 자주 볼 수 있다.

그래서 배워봤다.


추천 시스템을 만들면서 가끔 웹 대시보드를 통해서 인퍼런스 결과를 보여주고자 할 때가 있다.

그땐,

(N, 300) dot (250000, 300).T 연산을 해야한다.


아...

이거 자바스크립트로 어떻게 할 수 있지?

그냥 파이썬 서버-사이드에서 전부 연산하고 결과만 Return 해주는 방식을 택하게 된다.


음...

이거 사내-시스템으로 사용하면 심각한 부하는 없을 것 같은데

수많은 트랙픽이 몰린다면 어떻게 될까?


그래서 진짜 Numpy, Pandas 등의 라이브러리를 사용할 수 있는지 확인만 해봤다.


Pyodide Github 참조!



<!DOCTYPE html>
<html>
<head>
<script src="https://cdn.jsdelivr.net/pyodide/v0.18.1/full/pyodide.js"></script>
</head>

<body>
<p>
You can execute any Python code. Just enter something in the box below and
click the button.
</p>
<input id="code" value="np" />
<button onclick="evaluatePython()">Run</button>
<br />
<br />
<div>Output:</div>
<textarea id="output" style="width: 100%;" rows="6" disabled></textarea>

<script>
const output = document.getElementById("output");
const code = document.getElementById("code");

function addToOutput(s) {
output.value += ">>>" + code.value + "\n" + s + "\n";
}

output.value = "Initializing...\n";
// init Pyodide
async function main() {
let pyodide = await loadPyodide({
indexURL: "https://cdn.jsdelivr.net/pyodide/v0.18.1/full/",
});

await pyodide.loadPackage('numpy')
await pyodide.loadPackage('pandas')
await pyodide.loadPackage('micropip')

output.value += "Ready!\n";
return pyodide;
}
let pyodideReadyPromise = main();

async function evaluatePython() {
let pyodide = await pyodideReadyPromise;
pyodide.runPython("import numpy as np");
pyodide.runPython("import pandas as pd");

try {
startTime = new Date();
let output = pyodide.runPython(code.value);
addToOutput(code.value + " : " + outdeput);
endTime = new Date();
addToOutput(endTime - startTime);
} catch (err) {
addToOutput(err);
}
}
</script>
</body>
</html>


위 파일을 보면,

코드가 너무... 쉽게 보여서 이게 뭐지? 라는 느낌이 날 수 있다.


실행하면 이런 화면이 보인다.

스크린샷 2021-11-09 00.58.51.png


Run 버튼을 눌러보면,

스크린샷 2021-11-09 01.01.04.png

진짜. numpy 모듈을 사용할 수 있다.


TextField에 np.ones(100) 을 입력하면 아마도 기대하는 그 값을 볼 수 있다.

직접 해보면 좋을 것 같다.

keyword
작가의 이전글Python 성능을 올리려면?