최근 모델 Pytohon
11693 단어 NumbatorchscriptPython
개시하다
주식회사 미래 번역 고객 성공 서비스@shhshn를 담당합니다.
일상적으로 사용하는 업무와 특별한 관계가 없다고 말하는 파이톤.
제품 개발에서 파이톤을 사용할 때 모델을 명시하는 것이 중요하다.
"파이톤으로 극대화"라는 말도 있는데, 주요 이유는 다음과 같은 두 가지다.
이 글은 누마·타치스크립트 등 3가지 고속화 방법을 소개한다.
Numba
콘다의 유명한 아나콘다가 주도적으로 개발한 JIT 컴파일러다.from numba import jit
import random
@jit(nopython=True)
def monte_carlo_pi(nsamples):
acc = 0
for i in range(nsamples):
x = random.random()
y = random.random()
if (x ** 2 + y ** 2) < 1.0:
acc += 1
return 4.0 * acc / nsamples
예를 들어 상술한 코드는 특별히 명확한 유형이 없지만 추론에 의하면 LLVM으로 컴파일된다.그 결과 C++에서 쓴 코드와 같은 속도를 발휘했다.C++에서 호출할 수도 있습니다.
Numba의 이점
from numba import jit
import random
@jit(nopython=True)
def monte_carlo_pi(nsamples):
acc = 0
for i in range(nsamples):
x = random.random()
y = random.random()
if (x ** 2 + y ** 2) < 1.0:
acc += 1
return 4.0 * acc / nsamples
@jit
를 추가하면 고속화numpy
와의 호환성이 높아 기본적으로 JIT화@jit(nogil=True)
에서 GIL을 제거하면 CPython의 한계를 돌파할 수 있다Numba의 약점
dict
없었어TorchScript
페이스북이 PyTorch의 일환으로 개발한 컴파일 기능이다.@torch.jit.script
def scripted_fn(x : torch.Tensor):
for i in range(12):
x = x + x
return x
def fn(x):
x = torch.neg(x)
import pdb; pdb.set_trace()
return scripted_fn(x)
traced_fn = torch.jit.trace(fn, (torch.rand(4, 5),))
traced_fn(torch.rand(3, 4))
이 예는 두 가지 방법으로 유형 파이톤으로 처리된다.torch.jit.trace
Numba처럼 함수를 전체적으로 추리한다.
한편, @torch.jit.script
mypy 형식으로 명시된 유형.
TorchScript의 장점
@torch.jit.script
def scripted_fn(x : torch.Tensor):
for i in range(12):
x = x + x
return x
def fn(x):
x = torch.neg(x)
import pdb; pdb.set_trace()
return scripted_fn(x)
traced_fn = torch.jit.trace(fn, (torch.rand(4, 5),))
traced_fn(torch.rand(3, 4))
TorchScript의 약점
다른 언어 사용 옵션
속도를 위주로 하는 스크립트 언어도 많다.예를 들어Julia 줄리아는 JIT에 대응하는 어느 날의 길이를 자주 비교한다.솔직히 파이톤의 문법, 생태계 등 미세한 차이를 제외한 다른 언어는 충분히 선택할 수 있다.
그리고 처음부터 끝까지 C++로 쓴 빨대 스타일.보수적 운용(특히 인적자원)에 문제가 없다면 C++로 쓰는 것이 좋다.
예: Python에서 C++로 컴파일
https://github.com/shhshn/sonish(개념 검증 코드)
최근 C++에도 유형 추론이 있기 때문에 디스플레이를 하지 않아도 파이톤에서 C++로 변환할 수 있습니다.def main():
print("Hello and, again!")
l = [3, 2]
l.append(1)
for x in l:
print(x)
d = {4: "HUGE", 5: "SUCCESS"}
print(d[5])
if __name__ == "__main__":
main()
예를 들어, 위의 Python을 동일한 출력의 C++로 변환할 수 있습니다.#include <iostream>
#include <vector>
#include <unordered_map>
#include <iomanip>
int main() {
std::cout << std::setprecision(17) << "Hello and, again!" << std::endl;
auto l = std::vector<int>{3, 2};
l.push_back(1);
for (auto x : l) {
std::cout << std::setprecision(17) << x << std::endl;
}
auto d = std::unordered_map<int, const char *>{{4, "HUGE"}, {5, "SUCCESS"}};
std::cout << std::setprecision(17) << d[5] << std::endl;return 0;
}
끝말
파이톤의 인프라와 C++의 제품화 사이의 차이를 메우는 것에 대해 이야기했다.
이 글은 참가했다향후 번역 Advent Calendar 2020.
다음 AWS의 주인@kobarasukimaro이 또 등장한 것 같아요.
그 전@reonyanarticle에 "CLI 제작 모듈 클릭에 대해서"!
Reference
이 문제에 관하여(최근 모델 Pytohon), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/shhshn/items/99e1c28cadc900999ec7
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
def main():
print("Hello and, again!")
l = [3, 2]
l.append(1)
for x in l:
print(x)
d = {4: "HUGE", 5: "SUCCESS"}
print(d[5])
if __name__ == "__main__":
main()
#include <iostream>
#include <vector>
#include <unordered_map>
#include <iomanip>
int main() {
std::cout << std::setprecision(17) << "Hello and, again!" << std::endl;
auto l = std::vector<int>{3, 2};
l.push_back(1);
for (auto x : l) {
std::cout << std::setprecision(17) << x << std::endl;
}
auto d = std::unordered_map<int, const char *>{{4, "HUGE"}, {5, "SUCCESS"}};
std::cout << std::setprecision(17) << d[5] << std::endl;return 0;
}
파이톤의 인프라와 C++의 제품화 사이의 차이를 메우는 것에 대해 이야기했다.
이 글은 참가했다향후 번역 Advent Calendar 2020.
다음 AWS의 주인@kobarasukimaro이 또 등장한 것 같아요.
그 전@reonyanarticle에 "CLI 제작 모듈 클릭에 대해서"!
Reference
이 문제에 관하여(최근 모델 Pytohon), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/shhshn/items/99e1c28cadc900999ec7텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)