왜 나는 데이터 처리에서 Python 대신 Nim을 사용합니까?
Why I Use Nim instead of Python for Data Processing
게으른 프로그래머는 계산의 시간을 프로그래밍의 시간으로 바꾸려고 한다.내가 바로 그런 프로 선수다.내 연구에서 임시직급의 대규모 데이터를 대상으로 하는 알고리즘을 자주 설계하고 집행한다.NIH의 페로인 나는 10만 대 이상의 프로세서를 탑재한 클러스터를 이용한 바이오wulf지만, 큰 맵리듀스를 실행했다면 좋았을 텐데, 한 실험을 위해 단식홍의 성능을 최적화하는 데 막대한 시간을 들이는 것은 보통 의미가 없었다.
비록 이런 자원이 있지만, 나는 데이터 처리 작업에서 프로그래밍 언어인 Nim을 사용하는 경우가 많아졌다.Nim은 계산과학 분야에서는 그다지 평가받지 못하지만, 비수치 데이터 처리 파이톤을 대체하는 매우 유능한 언어다.Nim은 파이톤처럼 간단하게 쓸 수 있고 C처럼 빠르다.Nim은 컴파일링 언어 성능과 동적 언어 표현 능력을 겸비한 차세대 언어 중 하나다.파이톤을 알았다면 닉의 90%를 알고 그 은혜를 받을 수 있었을 것이다.
우리 아래의 간단한 문제를 고려해 봅시다.
>
에서 시작된 줄이 제목 설명으로 분할된 텍스트 파일 (즉 FASTA 형식) 에 저장된 DNA 배열 (A, T, G, C 네 글자로 구성된 문자열) 이 있는 덩어리.표준 작업은 GC 컨텐트에서 알려진 지표인 배열에서 G와 C의 비율을 계산하는 것입니다.파이톤에서 간단하게 다음과 같이 실현한다.# Python
gc = 0
total = 0
for line in open("orthocoronavirinae.fasta"):
if line[0] == '>': # ignore comment lines
continue
for letter in line.rstrip():
if letter == 'C' or letter == 'G':
gc += 1
total += 1
print(gc / total)
내 노트북으로 150MB의 일관바이러스 게놈 데이터 세트를 실행하는 데 23.43초가 걸린다.하지만 Nim을 사용하면 무료로 속도를 대폭 높일 수 있다.실제로 Nim의 설치는 다음과 같습니다.# Nim
var gc = 0
var total = 0
for line in lines("orthocoronavirinae.fasta"):
if line[0] == '>': # ignore comment lines
continue
for letter in line:
if letter == 'C' or letter == 'G':
gc += 1
total += 1
echo(gc / total)
코드가 작아도 성능에 큰 장점이 있다.언어
운행 시간
Nim과의 비교
Python 3.9
23.43초
30.6x
PyPy 7.3
2.54초
3.3x
컴파일 옵션에 Nim1.4
-d:danger --gc:orc
첨부0.765초
1.0x
완전히 최적화된 컴파일링과 실행 주기가 PyPy를 사용하는 것보다 빠릅니다.Nim은 컴파일 후 자동 실행 프로그램
-r
의 명령 옵션이 있어 간단하게 실행할 수 있다.Nim은 컴파일러 언어이지만 컴파일 과정이 빨라서 해석기 언어를 대신해서 사용할 수 있다.거의 같다. Nim의 코드와 Python의 코드는 몇 가지 다르다.
open
함수가 아니라 lines
함수를 사용했다.lines
함수의 장점은 LF, CRLF 등 줄 바꿈을 자동으로 제거하기 때문에 사용할 필요가 없다는 것이다doline.rstrip()
.echo "Hello world!"
# Python
import sys
from Bio import SeqIO
from Bio.Seq import Seq
# 配列の長さkのイテレーター
def kmers(seq, k):
for i in range(len(seq) - k + 1):
yield seq[i:i+k]
for record in SeqIO.parse(sys.argv[1], "fasta"):
unique_kmers = set()
palindrome = False
for kmer in kmers(record.seq, 25):
if kmer.reverse_complement() in unique_kmers:
palindrome = True
break
unique_kmers.add(kmer)
if not palindrome:
print(record.format("fasta"))
그다음에 Nim.# Nim
import os
import sets
import bioseq # 筆者が作ったライブラリ。k-merイテレーターとFASTAのパーサーを含みます
for record in readFasta[Dna](paramStr(1)):
var uniqueKmers = initHashSet[Dna]()
var palindrome = false
for kmer in kmers(record, 25):
if kmer.reverseComplement() in uniqueKmers:
palindrome = true
break
uniqueKmers.incl(kmer)
if not palindrome:
echo(record.asFasta)
중복되지만 이 절차들은 기본적으로 같다.여기서 현저한 차이점은paramStr
명령행 매개 변수 가져오기Nim은 경험이 풍부한 파이톤 사용자로 자신의 지식을 간단하게 번역할 수 있다. 닉은 자신의 언어로 빛을 발하기 시작했고 더욱 개인적인 스타일에 맞는 코드를 쓸 때이다.나는 Nim의 다른 뛰어난 언어 기능 때문에, Nim의 프로그램은 보통 Python의 프로그램보다 짧고 간단하게 쓸 수 있다는 것을 알아차렸다.이런 특징들은 한 문장의 범위를 넘어섰다.나는 1년 동안 일상생활에서 Nim을 사용해 왔지만 연기, 간단함, 우아함에 감동을 받았다.데이터를 처리하고 싶을 때 반드시 Nim을 시험해 보세요.CPU 고마워하겠지?
Reference
이 문제에 관하여(왜 나는 데이터 처리에서 Python 대신 Nim을 사용합니까?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/dumblepy/articles/6d9d614502c249텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)