왜 나는 데이터 처리에서 Python 대신 Nim을 사용합니까?

12551 단어 NimPythonidea
이 문장은 다음과 같다.
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의 코드는 몇 가지 다르다.
  • 변수는 var을 사용하여 성명한다.Nim에서 let을 사용하여 실행 시간 상수를 정의하고 컴파일할 때 변이 가능성을 검사할 수 있습니다.const로 컴파일할 때의 상수도 지원합니다.
  • 파일 내용을 한 줄 한 줄 반복하기 위해 open 함수가 아니라 lines 함수를 사용했다.lines 함수의 장점은 LF, CRLF 등 줄 바꿈을 자동으로 제거하기 때문에 사용할 필요가 없다는 것이다doline.rstrip().
  • print 대신 echo를 사용합니다.약간의 차이는 있지만 echo의 장점은 Pythn2이다.x시대의 print-as-a-statement 스타일의 표현이 부활했다.(예: echo "Hello world!"
  • Nim의 편의성을 설명하기 위해서 제가 연구에서 만난 실제 사례를 고려해 주세요.나의 데이터에는 많은 회문이 포함되어 있어서 새로운 바이러스 검색을 방해했다.인공물의 특징은 긴 부분의 배열과 그 반상(부분의 배열은 반대로 각 알칼리는 대응하는 한 쌍으로 바뀐다)이다.문제의 범위를 파악하기 위해서는 데이터세트의 각 배열을 조사해 인공물인지 여부를 확인하고 제거해야 한다.우선 파이톤의 표준 방법을 살펴봅시다.
    # 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)
    
    중복되지만 이 절차들은 기본적으로 같다.여기서 현저한 차이점은
  • Nim 사용paramStr 명령행 매개 변수 가져오기
  • 표준명명규칙은snake케이스가 아니라 카멜케이스.Nim은 첫 번째 문자를 제외한 대문자와 밑줄을 삭제한 후 같은 값이 있으면 변수가 동일하게 간주됩니다.원하는 스타일을 활용할 수 있다는 것이다.
  • 똑같이 간단하게 쓸 수 있지만 Nim의 인코딩 속도는 20배 빠르다.가령 알고리즘에 큰 차이가 없다고 가정한다면 파이톤이 Nim에서 기본적인 성능으로 이기는 것은 근본적으로 불가능하다.Nim의 컴파일링 과정에서 C 파일이 생성되고 좋아하는 C 컴파일러가 컴파일하기 때문이다.Nim은 표준 C 출력을 생성하기 위해 Python과 호환됩니다.Nim에서 Python 호출Python에서 Nim 호출.
    Nim은 경험이 풍부한 파이톤 사용자로 자신의 지식을 간단하게 번역할 수 있다. 닉은 자신의 언어로 빛을 발하기 시작했고 더욱 개인적인 스타일에 맞는 코드를 쓸 때이다.나는 Nim의 다른 뛰어난 언어 기능 때문에, Nim의 프로그램은 보통 Python의 프로그램보다 짧고 간단하게 쓸 수 있다는 것을 알아차렸다.이런 특징들은 한 문장의 범위를 넘어섰다.나는 1년 동안 일상생활에서 Nim을 사용해 왔지만 연기, 간단함, 우아함에 감동을 받았다.데이터를 처리하고 싶을 때 반드시 Nim을 시험해 보세요.CPU 고마워하겠지?

    좋은 웹페이지 즐겨찾기