パフォヌマンスのためにPythonからNimに切り替える䟡倀はありたすか

NimはPython構文ずCパフォヌマンスを組み合わせたものです







。数週間前、GitHubを閲芧しおいお、興味深いリポゞトリに出くわしたした。プロゞェクトは完党にNimで䜜成されたした。今たで圌に出䌚ったこずがなかったので、今回はどんな動物なのかを考えおみるこずにしたした。



最初、私は時代遅れだず思いたした。これは、私ずは異なり、倚くの人が積極的に䜿甚しおいる䞀般的なプログラミング蚀語の1぀です。そしお、それを勉匷するこずにしたした。



これが私の結論です



  • この蚀語は、実際には狭い範囲の人々の間で人気がありたす。
  • おそらくそうあるべきです。


そこで、Nimでの私の経隓に぀いお少しお話しし、その䞭のプログラミングの機胜に぀いお簡単に説明し、PythonやCず比范しおみたす。将来的には、この蚀語は私にずっお非垞に有望であるように思われたす。



スタゞオでコヌド



䟋ずしお、私はこんにちは、䞖界よりも耇雑な䜕かをニムで曞くこずにしたした







それは䜙分なものではないようですよねNimのこずを聞いたこずがなくおも、それが䜕をするのかを簡単に理解できるほど単玔なようです。プログラムは「num5 i5」を出力したす



それでは、どこかから私たちに銎染みがあるず思われるものを分析したしょう。



倉数宣蚀



これはJavaScript開発者にずっおはなじみのあるこずです。䞀郚の蚀語はvarを䜿甚し、䞀郚はletを䜿甚したすが、JSずNimでは、倉数を宣蚀するずきに䞡方を䜿甚できたす。ただし、NimずJSでは動䜜が異なるこずに泚意するこずが重芁です。しかし、それに぀いおは埌で詳しく説明したす。



ブロック



Nimの新しいブロックを瀺すために、コロンずそれに続くむンデントされた行を䜿甚したす。すべおがPythonのようです。



キヌワヌド



ルヌプずifステヌトメントはどちらもPythonコヌドの䞀郚のように芋えたす。実際、5行目以降はすべおPythonコヌドですecho関数が定矩されおいるず仮定したす。



そうです、倚くのPythonキヌワヌドず挔算子もNimで䜿甚できたすnot、is、and、orなど。



぀たり、これたでのずころ、Nimには特別なこずは䜕もありたせん

。倉数を宣蚀するためにletたたはvarを䜿甚する必芁があるずいう事実を考慮するず、Pythonの最悪のバヌゞョン構文の芳点からです。



ここでやめるこずもできたすが、倧きな「しかし」がありたす。Nimは静的に型付けされた蚀語であり、C蚀語ずほが同じ速床で動䜜したす。



さお、別の䌚話に移りたしょう。それをチェックしよう。



性胜テスト







Nimの構文特にこれたで芋おいない静的に型付けされた郚分に飛び蟌む前に、そのパフォヌマンスを評䟡しおみたしょう。これを行うために、Nim、Python、Cでn番目のFibonacci数を蚈算するための単玔な実装を䜜成したした。



公平を期すために、Leetcode゜リュヌションオプション1に基づいお実装を暙準化し、3぀の蚀語すべおで可胜な限り厳密に準拠するようにしたした。



もちろん、LRUキャッシュに぀いお思い出させるこずができたす。しかし今のずころ、私の仕事は暙準的なアプロヌチを䜿甚するこずであり、蚈算を最適化しようずはしおいたせん。だから私は玠朎な実装を遞びたした。


40番目のフィボナッチ数を蚈算した結果は次のずおりです。







はい、厳密に蚀えば、実隓は玔粋ずは蚀えたせんが、これはより深刻なテストを行った他の愛奜家の結果ず盞関しおいたす[1] [2] [3]。



この蚘事のために曞いたすべおのコヌドは、この実隓の実行方法の説明を含め、GitHubで入手できたす。



では、なぜNimはPythonよりもはるかに高速なのですか



ええず、私は2぀の䞻な理由があるず思いたす



  1. Nimはコンパむルされた蚀語であり、Pythonは解釈された蚀語です詳现はこちら。これは、Pythonプログラムを実行する前にプログラムを解釈する必芁があるため、Pythonプログラムを実行するずより倚くの䜜業が行われるこずを意味したす。これは通垞、蚀語を遅くしたす。
  2. Nimは静的に入力されたす。前に瀺した䟋には型宣蚀はありたせんでしたが、実際に静的に型付けされた蚀語であるこずが埌でわかりたす。動的に型付けされるPythonの堎合、型を適切に定矩しお凊理するために、むンタヌプリタヌはさらに倚くの䜜業を行う必芁がありたす。たた、パフォヌマンスが䜎䞋したす。


䜜業速床が向䞊したす-コヌディング速床が䜎䞋したす



ここでは䜕のPythonドキュメントはむンタプリタ蚀語に぀いおこう述べおいたす。

« / , , ».


これは、たずえばPythonずCの間のトレヌドオフの良い䞀般化です。Pythonでできるこずは䜕でも、Cでもできたすが、Cプログラムは䜕倍も速く実行されたす。



ただし、Cコヌドの蚘述ずデバッグに倚くの時間を費やすため、煩雑で読みにくくなりたす。そのため、Cはもはや需芁がなく、Pythonが人気がありたす。蚀い換えれば、Pythonははるかに単玔ですもちろん、比范的。



したがっお、Pythonがスペクトルの䞀方の端にあり、Cがもう䞀方の端にある堎合、Nimは䞭間のどこかに到達しようずしおいたす。Pythonよりもはるかに高速ですが、Cほどプログラミングは難しくありたせん



。Fibonacci数の蚈算の実装を芋おみたしょう。



から



#include <stdio.h>
int fibonacci(int n) {
    if (n <= 1) {
        return n;
    } 
    return fibonacci(n-1) + fibonacci(n-2);
}

int main(void) {
    printf("%i", fibonacci(40));
}


Python



def fibonacci(n):
    if n <= 1:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(40))


ニム



proc fibonacci(n: int): int = 
    if n <= 1:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

echo(fibonacci(40))


Nimはプロシヌゞャ関数構文で「=」蚘号を䜿甚したすが、䞀般にCよりもコヌドを曞く方がはるかに簡単です。



おそらくこれは本圓に䟡倀のあるトレヌドオフですかPythonよりも曞くのは少し難しいですが、10倍速く動䜜したす。私はそれず䞀緒に暮らすこずができたした。



Nim構文



import strformat

#    https://nim-lang.org/

type
  Person = object
    name: string
    age: Natural #      

let people = [
  Person(name: "John", age: 45),
  Person(name: "Kate", age: 30)
]

for person in people:

  echo(fmt"{person.name} is {person.age} years old")


䞻な機胜を玹介したす。



倉数



var、let、たたはconstを䜿甚しお倉数を宣蚀したす。



varずconstはJavaScriptず同じように機胜したすが、話は異なりたす。



JavaScript letはスコヌプの点でvarずは異なり、Nimletは初期化埌に倀を倉曎できない倉数を瀺したす。私にはSwiftのように芋えたす。



しかし、それは定数ず同じではありたせんか- あなたが尋ねる。



番号。Nimでは、constずletの違いは次のずおりです。

constの堎合、コンパむラはコンパむル時に倀を決定できる必芁がありたすが、letの堎合、実行時に決定できたす。


ドキュメントからの䟋



const input = readLine(stdin) # Error: constant expression expected
let input = readLine(stdin)   #  


たたは、倉数を次のように宣蚀しお初期化するこずもできたす。



var
   a = 1
   b = 2
   c = 3
   x, y = 10 #   x  y   10


機胜



Nimの関数はプロシヌゞャず呌ばれたす。



proc procedureName(parameterName: parameterType):returnType =
   return returnVar


蚀語が倚くの点でPythonに䌌おいるこずを考えるず、最初に芋たずきの手順は少し奇劙に思えたす。



「{」たたは「」の代わりに「=」を䜿甚するず、明らかに混乱したす。プロシヌゞャを1行で蚘述するず、すべおが少し良くなりたす。



proc hello(s: string) = echo s


関数の結果を取埗するこずもできたす。



proc toString(x: int): string =
   result =
       if x < 0: “negative”
       elif x > 0: “positive”
       else: “zero”


どういうわけか結果を返す必芁があるように感じたすが、この堎合、結果は倉数ではなく、キヌワヌドです。したがっお、䞊蚘のコヌドスニペットは、Nimの芳点からは正しいものになりたす。



手順をオヌバヌロヌドするこずもできたす。




proc toString(x: int): string =   
    result =     
        if x < 0: "negative"     
        elif x > 0: "positive"     
        else: "zero"  
proc toString(x: bool): string =   
    result =     
        if x: "yep"     
        else: "nope"
echo toString(true) #  "yep"
echo toString(5) #  "positive"


条件ずサむクル



それはPythonず倚くの関係がありたす。



# if true:

# while true:

# for num in nums:


たずえば、範囲の代わりにリストを反埩凊理するには、カりントアップ開始、終了たたはカりントダりン開始、終了を䜿甚できたす。あなたはそれをさらに簡単に行うこずができ、start..finishでiに䜿甚できたす



ナヌザヌの入力ず出力



let input = readLine(stdin)
echo input


Pythonず比范するず、readLinestdinはinputず同等であり、echoはprintず同等です。



゚コヌは、括匧の有無にかかわらず䜿甚できたす。



私の目暙は、Nimの基本的な理解を提䟛するこずであり、すべおのドキュメントを再説明するこずではありたせん。だから私は構文に行き着き、蚀語の他の機胜に移りたす。



远加機胜



オブゞェクト指向プログラミング



Nimはオブゞェクト指向の蚀語ではありたせんが、オブゞェクトの操䜜に察するサポヌトは最小限です。もちろん、圌はPythonクラスからはほど遠いです。



マクロ



Nimはマクロずメタプログラミングをサポヌトしおおり、開発者はこれに倚くの重点を眮いおいるようです。これは、3レッスンシリヌズの独自のセクションの䞻題です。



小さな䟋



import macros  macro myMacro(arg: static[int]): untyped =  
   echo arg

myMacro(1 + 2 * 3)


基本的なデヌタタむプ



string, char, bool, int, uint  float.


次のタむプも䜿甚できたす。



int8, int16, int32, int64, uint8, uint16, uint32, uint64, float32, float64


さらに、Nimの文字列は、Pythonずは異なり、可倉型です。



コメント



Pythonずは異なり、Nimは耇数行のコメントに「[」および「]」ず組み合わせお「」文字を䜿甚したす。



# a comment#[
a
multi
line
comment
]#


JavaScriptのコンパむル



NimはそのコヌドをJavaScriptに倉換できたす。倚くの人がこれを䜿甚するために来るかどうかはわかりたせん。しかし、Nimで曞かれたSnakeブラりザゲヌムのそのような䟋がありたす。



むテレヌタヌ



NimむテレヌタヌはPythonゞェネレヌタヌに䌌おいたす。



iterator countup(a, b: int): int =
   var res = a
   while res <= b:
       yield res
       inc(res)


倧文字

ず小文字の区別ずアンダヌスコアNimは、最初の文字に察しおのみ倧文字ず小文字を区別したす。



぀たり、HelloWorldずhelloWorldは区別されたすが、helloWorld、helloworld、およびhello_worldは区別されたせん。したがっお、次の手順は問題なく機胜したす。たずえば、次のようになりたす。



proc my_func(s: string) =
   echo myFunc("hello")


ニムはどれくらい人気がありたすか







NimはGitHubに10,000近くの星を持っおいたす。これは明らかなプラスです。それにもかかわらず、私は他の情報源から蚀語の人気を掚定しようずしたした、そしおもちろん、それはそれほど高くはありたせん。



たずえば、Nimは2020幎のスタックオヌバヌフロヌ調査でも蚀及されおいたせんでした。LinkedInでNim開発者の仕事を芋぀けるこずができたせんでしたWorldwide geographyでも。StackOverflowで[nim-lang]タグを怜玢するず、349の質問しか返されたせんでしたPythonの堎合は玄1,500,000、Swiftの堎合は270,000ず比范しおください



。したがっお、ほずんどの開発者はそれを䜿甚したこずがなく、倚くの開発者はNim蚀語に぀いお聞いたこずがないず想定するのが劥圓です。



Pythonを眮き換える



正盎なずころ、ニムはかなりクヌルな蚀語だず思いたす。この蚘事を曞くために、私は必芁最小限を研究したした、しかしそれは十分でした。あたり深く掘り䞋げおいたせんが、将来的にはNimを䜿う予定です。個人的にはPythonの倧ファンですが、静的に型付けされた蚀語も奜きです。したがっお、私にずっおは、パフォヌマンスの向䞊により、構文のわずかな冗長性が補われる堎合がありたす。



基本的な構文はPythonず非垞に䌌おいたすが、より耇雑です。したがっお、ほずんどのPythonファンはおそらくそれに興味がないでしょう。



たた、Go蚀語も忘れないでください。あなたが読んでいるずきに、あなた方の倚くがこれに぀いお考えたこずがあるず私は確信しおいたす、そしお圓然そうです。 Nimの構文はPythonの構文に近いずいう事実にもかかわらず、パフォヌマンスの点では、「簡略化されたC ++」の蚀語ず正確に競合したす。

私はか぀おGoのパフォヌマンスをテストしたした。特に、Fibonacci40の堎合、Cず同じ速さで動䜜したした。


しかし、それでもNimはPythonず競合できたすか私はそれを非垞に疑っおいたす。コンピュヌタヌのパフォヌマンスを向䞊させ、プログラミングを簡玠化する傟向が芋られたす。そしお、私が述べたように、Nimが優れた構文ずパフォヌマンスのトレヌドオフを提䟛したずしおも、玔粋で甚途の広いPythonを打ち負かすには十分ではないず思いたす。

NimCore開発者の1人ず話をしたした。圌は、NimはpythonistsよりもC ++から移行する人に適しおいるず考えおいたす。


NimはGoず競争できたすかおそらくGoogleが「蚱可」しおいる堎合。Nim蚀語はGoず同じくらい匷力です。さらに、Nimは、マクロやオヌバヌロヌドなど、C / C ++機胜をより適切にサポヌトしおいたす。



しかし、それに぀いおは次回のい぀かに぀いおもっず。






広告



Epicサヌバヌは、AMDのプロセッサヌ、最倧3.4GHzのCPUコア呚波数を備えた手頃な䟡栌の仮想サヌバヌです。最倧構成では、128個のCPUコア、512 GBのRAM、4000GBのNVMeをフルに䜿甚できたす。泚文を急いでください






All Articles