ホームページ  >  記事  >  バックエンド開発  >  Pythonをgolangに翻訳したもの

Pythonをgolangに翻訳したもの

王林
王林オリジナル
2023-05-10 11:15:36711ブラウズ

はじめに

Python は広く使用されている高級プログラミング言語です。学習と使用が簡単で、コードが簡潔で、開発効率が高いです。データ サイエンス、機械学習で広く使用されています。そして他の分野。 Go 言語は、より優れた同時実行パフォーマンスと高いコード実行効率を備えた新星です。したがって、Python コードの実行効率を向上させたり、コンピューターのマルチコア リソースを有効に活用したりする必要がある場合、Go 言語を使用してより効率的なプログラムを作成できます。

この記事では主に Python コードを Go 言語に変換する方法を紹介し、Python の関数の観点から Go 言語プログラムの設計と最適化の方法について説明します。

1. Python コードの Go 言語への翻訳

Python コードを Go 言語に翻訳する前に、2 つの言語の違いと類似点を理解する必要があります。 Python は、コードの読みやすさとシンプルさを重視した動的型付け言語です。 Go 言語は、コードの保守性と同時処理機能に重点を置いた静的型付け言語です。

Python コードを Go 言語に変換するには 2 つの方法があり、1 つは Go 言語のコードを手動で記述し、Python プログラムのロジックに従って対応する Go 言語の関数を実装する方法です。 2 つ目は、py2go や transcrypt などの既存の翻訳ツールを使用することです。

Go 言語コードの手動作成

以下では、2 つの言語間の関係をより深く理解するために、Python コードを Go 言語コードに変換する例をいくつか紹介します。

Python コード:

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

print([fib(i) for i in range(10)])

Go 言語コード:

package main

import "fmt"

func fib(n int) int {
    if n <= 1 {
        return n
    } else {
        return (fib(n-1) + fib(n-2))
    }
}

func main() {
    for i := 0; i < 10; i++ {
        fmt.Printf("%d ", fib(i))
    }
}

別の例を示します:

Python コード:

def merge_sort(lst):
    if len(lst) <= 1:
        return lst
    mid = len(lst) // 2
    left = merge_sort(lst[:mid])
    right = merge_sort(lst[mid:])
    return merge(left, right)

def merge(left, right):
    result = []
    i, j = 0, 0
    while i < len(left) and j < len(right):
        if left[i] < right[j]:
            result.append(left[i])
            i += 1
        else:
            result.append(right[j])
            j += 1
    result += left[i:]
    result += right[j:]
    return result

print(merge_sort([3, 1, 4, 2, 5]))

Go 言語コード:

package main

import "fmt"

func mergeSort(lst []int) []int {
    if len(lst) <= 1 {
        return lst
    }
    mid := len(lst) / 2
    left := mergeSort(lst[:mid])
    right := mergeSort(lst[mid:])
    return merge(left, right)
}

func merge(left []int, right []int) []int {
    result := []int{}
    i, j := 0, 0
    for i < len(left) && j < len(right) {
        if left[i] < right[j] {
            result = append(result, left[i])
            i++
        } else {
            result = append(result, right[j])
            j++
        }
    }
    result = append(result, left[i:]...)
    result = append(result, right[j:]...)
    return result
}

func main() {
    lst := []int{3, 1, 4, 2, 5}
    fmt.Println(mergeSort(lst))
}

コード変換には翻訳ツールを使用します

翻訳ツールを使用すると、手書きコードの時間と作業負荷を軽減できます。たとえば、py2go 翻訳ツールを使用して、上記の Python コードを Go に変換します。言語コード:

Python コード:

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

print([fib(i) for i in range(10)])

Go 言語コード:

package main

import (
    "fmt"
)

func fib(n int) int {
    if n <= 1 {
        return n
    } else {
        return (fib(n-1) + fib(n-2))
    }
}

func main() {
    var lst []int
    for i := 0; i < 10; i++ {
        lst = append(lst, fib(i))
    }
    fmt.Println(lst)
}

2. Python 関数の観点から Go 言語プログラムを設計および最適化する

Python 関数の観点からは、次の方法で Go 言語プログラムを最適化できます。

  1. 初期パラメータの型宣言

Go 言語は静的に型付けされる言語であり、関数の定義時にパラメータの型を宣言する必要があります。同時に、Go言語のパラメータの受け渡し方法は値の受け渡しですが、Pythonのパラメータの受け渡し方法は参照の受け渡しです。

Python コード:

def add(x, y):
    x.append(y)
    return x

lst = [1, 2, 3]
print(add(lst, 4))    # [1, 2, 3, 4]
print(lst)            # [1, 2, 3, 4]

Go 言語コード:

func add(x []int, y int) []int {
    x = append(x, y)
    return x
}

func main() {
    lst := []int{1, 2, 3}
    fmt.Println(add(lst, 4))    // [1 2 3 4]
    fmt.Println(lst)            // [1 2 3]
}

Go 言語では、関数内でパラメータを変更できるように、パラメータをスライス タイプとして宣言する必要があります。

  1. 空の識別子の使用

Go 言語で空の識別子 _ を使用すると、匿名変数を表すことができます。たとえば、Python では、通常、変数名を置き換えるためにアンダースコア _ が使用されます。 . この変数がその後の使用で参照されないことを示します。

Python コード:

x, _, y = (1, 2, 3)
print(x, y)    # 1 3

Go 言語コード:

x, _, y := []int{1, 2, 3}
fmt.Println(x, y)    // 1 3

Go 言語では、アンダースコア _ を使用して匿名変数を表しますが、そのスコープは現在のステートメント ブロックです。たとえば、underscore_ に値を代入すると、その値は破棄されます。

  1. インターフェイス指向プログラミング

ポリモーフィズムの場合、Python にはダックタイピング機能が組み込まれています。つまり、オブジェクトの適用性はその型に基づいていません。 、しかし、それが持っているメソッドに基づいています。 Go 言語では、インターフェイスを使用してポリモーフィズムを実現できます。

たとえば、次のコードでは、Cat と Dog の両方が Animal インターフェイスに Say メソッドを実装しているため、Test 関数内のオブジェクトの実際の型を気にする必要はなく、それが実装されているかどうかだけを気にする必要があります。動物インターフェイス。

Python コード:

class Animal:
    def say(self):
        pass

class Cat(Animal):
    def say(self):
        return 'meow'

class Dog(Animal):
    def say(self):
        return 'bark'

def test(animal):
    print(animal.say())

test(Cat())    # meow
test(Dog())    # bark

Go 言語コード:

type Animal interface {
    Say() string
}

type Cat struct {
}

func (c *Cat) Say() string {
    return "meow"
}

type Dog struct {
}

func (d *Dog) Say() string {
    return "bark"
}

func Test(animal Animal) {
    fmt.Println(animal.Say())
}

func main() {
    Test(&Cat{})    // meow
    Test(&Dog{})    // bark
}
  1. オプションのパラメーターとデフォルトのパラメーターをサポート

Python での記述オプションのパラメータとデフォルトのパラメータをサポートするメソッドは非常に柔軟で、関数定義でデフォルト値を指定することも、args と *kwargs を使用してオプションのパラメータを渡すこともできます。

Python コード:

def func(a, b=10, *args, **kwargs):
    print(a, b)
    for arg in args:
        print(arg)
    for key, value in kwargs.items():
        print(key, value)

func(1)    # 1 10
func(2, 3)    # 2 3
func(4, 5, 6, 7, eight=8, nine=9)    # 4 5 6 7 eight 8 nine 9

Go 言語では、関数のオーバーロードがサポートされているため、関数のパラメーター リストで必要に応じてさまざまな種類のパラメーターを定義できます。たとえば、次のコードでは、オーバーロードを使用してオプションのパラメーターとデフォルト値を実装します。

Go 言語コード:

func Func(a int, b int) {
    fmt.Println(a, b)
}

func Func2(a int, b int, args ...int) {
    fmt.Println(a, b)
    for _, arg := range args {
        fmt.Println(arg)
    }
}

func Func3(a int, kwargs map[string]int) {
    fmt.Println(a)
    for key, value := range kwargs {
        fmt.Println(key, value)
    }
}

func main() {
    Func(1, 10)    // 1 10
    Func(2, 3)    // 2 3
    Func2(4, 5, 6, 7)    // 4 5 6 7
    kwargs := map[string]int{"eight": 8, "nine": 9}
    Func3(4, kwargs)    // 4 eight 8 nine 9
}

概要

この記事では、Python コードを Go 言語コードに変換する方法を紹介し、Python 関数の観点からパラメーターを宣言する方法について説明します。型、空白識別子の使用、インターフェイス指向プログラミング、およびオプションのパラメーターとデフォルト値を実装するオーバーロードは、Go 言語プログラムを最適化する方法です。 Python 言語と Go 言語にはそれぞれ独自の特性、長所と短所があり、どの言語を選択するかは特定の状況に基づいて検討する必要があります。最後に、読んでいただきありがとうございました!

以上がPythonをgolangに翻訳したものの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。