Разное

Python vs go: Go vs Python. Виталий Левченко / Хабр

Содержание

изучение основ языка Go в сравнении с Python

Это не соревнование двух языков, а просто еще один способ обучения. Рассматриваем возможности языка Go, проводя параллели с Python.

Знаете Python? Бесплатные книги и другие туториалы по столь популярному языку программирования доступны повсеместно. Давайте же разберем на примере Python язык Go.

Go гораздо многословнее, чем Python. Чтобы сказать то же самое, ему требуется больше строк кода. Он меньше, чем Python, подходит для скриптового программирования, однако его популярность в этом качестве растет.

Hello World

Начнем с классики – незаменимой для обучения программы Hello World. В Python мы выводим легендарную фразу всего одной строчкой:

print("Hello world")

В Go придется приложить чуть больше усилий: указать имя главного пакета, подключить модуль fmt и оформить функцию main:

package main


import "fmt"


func main() {
  fmt.Println("Hello world")
}

Вывод данных

Продолжим с выводом и решим три фундаментальные задачи:

  • вывод строки с переходом на следующую строку;
  • вывод строки без перехода на следующую строку;
  • форматированный вывод.

В Python все три вещи может сделать единственная функция print:

print("Some string")
print("Some string", end="")
print("Name: {}, Age: {}".format("Peter", 35))

У языка Go есть три разных метода:

package main

import "fmt"

func main() {
  fmt.Println("Some string")
  fmt.Print("Some string")
  fmt.Printf("Name: %s, Age: %d\n", "Peter", 35)
}

Комментарии

Комментарии – важная часть документации кода, и программирование на Go – не исключение.

В языке Python они выглядят так:

"""doc string для целого модуля"""

# строчный комментарий

class Class(object):
   """doc string для класса"""


print(__doc__)
print(Class.__doc__)

Язык программирования Go предлагает широко распространенный синтаксис комментирования:

package main

// обычный строчный комментарий


/* тоже комментарий

 только на несколько строк
*/

/* Многострочный комментарий для функции main().
  Чтобы увидеть его, запустите в консоли команду:

    godoc comments.go

*/

func main() {
}

Многострочные блоки

В языке программирования Python за многострочность отвечают тройные кавычки. Также для оформления строк можно использовать двойные и одинарные кавычки.

print(
   """Это
многострочная строка.
"""
)
print("O'word " 'Another "word" ' "Last word.")

В Golang для строк используются двойные кавычки, следовательно, сам символ двойной кавычки внутри строки нужно экранировать. Многострочность обеспечивают обратные кавычки.

package main

import "fmt"

func main() {
  fmt.Println(`Это
    многострочная строка.
  `)
  fmt.Println(
    "O'word " +
    "Another \"word\" " +
    "Last word.")
}

Списки

Срез (slice) – это последовательность элементов, длина которой может изменяться. Основное различие между массивом и срезом состоит в том, что, работая с массивом, вы должны знать его размер.

Списки в Python:

# инициализируем список
numbers = [0] * 5
# изменяем один элемент
numbers[2] = 100
some_numbers = numbers[1:3]
print(some_numbers)  # [0, 100]
# получаем размер
print(len(numbers))  # 5

# инициализируем другой список
scores = []
scores.append(1.1)
scores[0] = 2.2
print(scores)  # [2.2]

У языка Go нет способа так же легко добавлять значения в существующий срез, поэтому вы можете инициализировать срез с максимальной длиной и постепенно добавлять в него элементы.

package main

import "fmt"

func main() {
    // инициализируем массив
    var numbers [5]int // [0, 0, 0, 0, 0]
    // меняем один элемент
    numbers[2] = 100
    // создаем срез из массива
    some_numbers := numbers[1:3]
    fmt.Println(some_numbers) // [0, 100]
    // получаем размер
    fmt.Println(len(numbers))

    // инициализируем срез
    var scores []float64
    scores = append(scores, 1.1) // пересоздаем, чтобы добавить элемент
    scores[0] = 2.2              // изменяем
    fmt.Println(scores)          // [2.2]

    // когда вы точно не знаете, сколько элементов
    // собираетесь положить в срез, можно сделать так
    var things [100]string
    things[0] = "Peter"
    things[1] = "Anders"
    fmt.Println(len(things)) // 100
}

Ассоциативные массивы

В ассоциативных массивах ключ может иметь нечисловое значение.

В Python эту функцию выполняют словари (dictionaries):

elements = {}
elements["H"] = 1
print(elements["H"])  # 1

# удалить по ключу
elements["O"] = 8
elements.pop("O")

# проверка наличия ключа

if "O" in elements:
   print(elements["O"])
if "H" in elements:
   print(elements["H"])

В Go для этой же цели мы можем использовать отображения:

package main

import "fmt"

func main() {
    elements := make(map[string]int)
    elements["H"] = 1
    fmt.Println(elements["H"])

    // удаление по ключу
    elements["O"] = 8
    delete(elements, "O")

    // сделать что-то с элементом, если он есть в отображении
    if number, ok := elements["O"]; ok {
        fmt.Println(number) // не будет выведено }
    if number, ok := elements["H"]; ok {
        fmt.Println(number) // 1
    }
}

В Golang даже можно создать отображение отображений:

elements : make(map[string]map[string]int)
elements["H"] = map[string]int{
   "protons": 1,
   "neutrons": 0,
}

Но помните, что для этой цели существует struct.

Логические значения

В Python внутри условия if можно использовать выражения с разными типами данных – в большинстве случаев они автоматически конвертируются в логическое значение True или False:

x = 1
if x:
   print "Yes"
y = []
if y:
   print "не будет выведено"

print(True and False)  # False
print(True or False)  # True
print(not True)  # False

У языка Go нет быстрого способа оценить истинность выражения, поэтому приходится делать это явно для каждого типа данных:

package main

import "fmt"

func main() {

  x := 1
  if x != 0 {
    fmt.Println("Yes")
  }
  var y []string
  if len(y) != 0 {
    fmt.Println("не будет выведено")
  }

  fmt.Println(true && false) // false
  fmt.Println(true || false) // true
  fmt.Println(!true)         // false

}

В этих примерах также видна работа основных логических операторов.

Циклы

В Python существует несколько видов циклов:

i = 1
while i <= 10:
   print(i)
   i += 1

# ...или...

for i in range(1, 11):
   print(i)

В языке программирования Go – всего один, и это цикл for:

package main

import "fmt"

func main() {
    i := 1
    for i <= 10 {
        fmt.Println(i)
        i += 1
    }

    // то же самое, но немного удобнее

    for i := 1; i <= 10; i++ {
        fmt.Println(i)
    }
}

Перебор элементов

Цикл for можно использовать для перебора элементов коллекции и в Python:

names = ["Peter", "Anders", "Bengt"]
for i, name in enumerate(names):
   print("{}. {}".format(i + 1, name))

и в Go:

package main

import "fmt"

func main() {
  names := []string{
    "Peter",
    "Anders",
    "Bengt",
  }
  /* будет выведено:

  1. Peter
  2. Anders
  3. Bengt
  */
  for i, name := range names {
    fmt.Printf("%d. %s\n", i+1, name)
  }
}

Switch

Множественные условия могут быть определены с помощью конструкции switch.

В Python она выглядит так:

def input_():
   return int(input())


number = input_()
if number == 8:
   print("Oxygen")
elif number == 1:
   print("Hydrogen")
elif number == 2:
   print("Helium")
elif number == 11:
   print("Sodium")
else:
   print("I have no idea what %d is" % number)


# Альтернативное решение
number = input_()
db = {1: "Hydrogen", 2: "Helium", 8: "Oxygen", 11: "Sodium"}
print(db.get(number, "I have no idea what %d is" % number))

А вот вариант кода для Go:

package main

import (
    "fmt"
    "strconv"
)

func str2int(s string) int {
    i, err := strconv.Atoi(s)
    if err != nil {
        panic("Not a number")
    }
    return i
}

func main() {
    var number_string string
    fmt.Scanln(&number_string)
    number := str2int(number_string)

    switch number {
        case 8:
        fmt.Println("Oxygen")
        case 1:
        fmt.Println("Hydrogen")
        case 2:
        fmt.Println("Helium")
        case 11:
        fmt.Println("Sodium")
        default:
        fmt.Printf("I have no idea what %d is\n", number)
    }

    // Альтернативное решение

    fmt.Scanln(&number_string)
    db := map[int]string{
        1:  "Hydrogen",
        2:  "Helium",
        8:  "Oxygen",
        11: "Sodium",
    }
    number = str2int(number_string)
    if name, exists := db[number]; exists {
        fmt.Println(name)
    } else {
        fmt.Printf("I have no idea what %d is\n", number)
    }

}

Как видно из примеров, оба языка предлагают более удобные альтернативные решения задачи с использованием ассоциативных массивов.

Вариативные функции

В Python функции могут принимать переменное число аргументов различных типов с помощью somefunction (*args).

def average(*numbers):
   return sum(numbers) / len(numbers)


print(average(1, 2, 3, 4))  # 10/4 = 2.5

В Go так нельзя. Однако есть возможность указать параметр, представляющий собой неопределенное количество значений одного конкретного типа:

package main

import "fmt"

func average(numbers ...float64) float64 {
  total := 0.0
  for _, number := range numbers {
    total += number
  }
  return total / float64(len(numbers))
}

func main() {
  fmt.Println(average(1, 2, 3, 4)) // 2.5
}

Измерение времени

В Python методы работы со временем собраны в модуле time:

import time

t0 = time.time()
time.sleep(3.5) 
t1 = time.time()
print("Took {:.2f} seconds".format(t1 - t0))

В языке программирования Go, как ни странно, тоже есть такой модуль:

package main

import "fmt"
import "time"

func main() {
  t0 := time.Now()
  elapsed := time.Since(t0)
  fmt.Printf("Took %s", elapsed)
}

Замыкания функций

Внутри одной функции можно спрятать другую, так что она становится недоступной для внешнего кода.

Вот так можно реализовать замыкание в Python:

def run():
   def increment(amount):
       return number + amount

   number = 0
   number = increment(1)
   number = increment(2)
   print(number)  # 3


run()

Обратите внимание, что используемая во внутренней функции переменная number доступна из скоупа внешней функции. Если бы ее там не было, возникла бы ошибка UnboundLocalError.

def increment(amount):
   number += amount
increment(1)
increment(2)

Нужную переменную можно объявить прямо внутри increment. А чтобы она была доступна на внешнем уровне, используется ключевое слово global.

def increment(amount):
   global number
   number += amount
increment(1)
increment(2)

А вот пример замыкания в Golang:

package main

import "fmt"

func main() {

    number := 0

    /* Это должна быть именно локальная переменная.
      Нельзя написать `func increment(amount int) {` */
    increment := func(amount int) {
        number += amount
    }
    increment(1)
    increment(2)

    fmt.Println(number) // 3

}

Defer

В Go defer имеет замечательный синтаксис. Отложенная операция стоит сразу после ключевого слова, так что смысл конструкции сразу же становится очевиден:

package main

import (
  "os"
)

func main() {
  f, _ := os.Open("defer.py")
  defer f.Close()
  // теперь вы можете читать из f
  // он будет закрыт в конце программы
}

В Python вы можете добиться того же, поместив код в try-finally блок:

f = open("defer.py")
try:
   f.read()
finally:
   f.close()

Panic Recover

Чтобы сгенерировать и поймать ошибку, в Python используется ключевое слово raise и конструкция try-except:

try:
   raise Exception("Shit")
except Exception as e:
   print("error was:", e)

В Go для этого есть оператор panic и функция recover:

package main

import "fmt"

func main() {

  // будет выведено:
  // error was: Shit!
  defer func() {
    fmt.Println("error was:", recover())
  }()
  panic("Shit!")
}

Изменяемость

Передавая параметром в функцию сложные структуры, например, массив или мапу, вы можете изменить прямо внутри функции, и это автоматически изменится снаружи.

В Python:

def upone(mutable, index):
   mutable[index] = mutable[index].upper()


list_ = ["a", "b", "c"]
upone(list_, 1)
print(list_)  # ['a', 'B', 'c']

dict_ = {"a": "anders", "b": "bengt"}
upone(dict_, "b")
print(dict_)  # {'a': 'anders', 'b': 'BENGT'}

В Golang:

package main

import (
    "fmt"
    "strings"
)

func upone_list(thing []string, index int) {
    thing[index] = strings.ToUpper(thing[index])
}

func upone_map(thing map[string]string, index string) {
    thing[index] = strings.ToUpper(thing[index])
}

func main() {
    // mutable
    list := []string{"a", "b", "c"}
    upone_list(list, 1)
    fmt.Println(list) // [a B c]

    // mutable
    dict := map[string]string{
        "a": "anders",
        "b": "bengt",
    }
    upone_map(dict, "b")
    fmt.Println(dict) // map[a:anders b:BENGT]
}

Структуры

В Python для создания пользовательских наборов полей используются классы. Метод __init__ вызывается при создании экземпляра класса:

from math import sqrt


class Point(object):
   def __init__(self, x, y):
       self.x = x
       self.y = y


def distance(point1, point2):
   return sqrt(point1.x * point2.x + point1.y * point2.y)


p1 = Point(1, 3)
p2 = Point(2, 4)
print(distance(p1, p2))  # 3.74165738677

В Go существует специальное ключевое слово struct:

package main

import (
    "fmt"
    "math"
)

type Point struct {
    x float64
    y float64
}

func distance(point1 Point, point2 Point) float64 {
    return math.Sqrt(point1.x*point2.x + point1.y*point2.y)
}

// Так как структуры автоматически копируются при передаче,
// лучше передавать их в функцию как указатели

func distance_better(point1 *Point, point2 *Point) float64 {
    return math.Sqrt(point1.x*point2.x + point1.y*point2.y)
}

func main() {
    p1 := Point{1, 3}
    p2 := Point{2, 4}
    fmt.Println(distance(p1, p2))          // 3.7416573867739413
    fmt.Println(distance_better(&p1, &p2)) // 3.7416573867739413
}

Методы

В Python методы определяются прямо внутри классов с помощью ключевого слова def, и первым аргументом принимают ссылку на экземпляр класса:

from math import sqrt


class Point(object):
   def __init__(self, x, y):
       self.x = x
       self.y = y

   def distance(self, other):
       return sqrt(self.x * other.x + self.y * other.y)


p1 = Point(1, 3)
p2 = Point(2, 4)
print(p1.distance(p2))  # 3.74165738677
print(p2.distance(p1))  # 3.74165738677

Методы в Go – это функции, прикрепленные к какому-то конкретному типу. Его параметр обязательно указывается в сигнатуре метода:

package main

import (
    "fmt"
    "math"
)

type Point struct {
    x float64
    y float64
}

func (this Point) distance(other Point) float64 {
    return math.Sqrt(this.x*other.x + this.y*other.y)
}

func (this *Point) distance_better(other *Point) float64 {
    return math.Sqrt(this.x*other.x + this.y*other.y)
}

func main() {
    p1 := Point{1, 3}
    p2 := Point{2, 4}
    fmt.Println(p1.distance(p2))         // 3.7416573867739413
    fmt.Println(p1.distance_better(&p2)) // 3.7416573867739413
}

Горутины

Горутины языка Go – это независимые параллельные операции. Сама функция main является горутиной. Для их определения используется оператор go:

package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
    "sync"
)

func f(url string) {
    response, err := http.Get(url)
    if err != nil {
        panic(err)
    }
    defer response.Body.Close()
    body, err := ioutil.ReadAll(response.Body)
    if err != nil {
        panic(err)
    }

    fmt.Println(len(body))
}

// Смотрите пример на https://golang.org/pkg/sync/#WaitGroup
func main() {
    var wg sync.WaitGroup
    urls := []string{
        "https://www.peterbe.com",
        "https://python.org",
        "https://golang.org",
    }
    for _, url := range urls {
        wg.Add(1)
        go func(url string) {
            defer wg.Done()
            f(url)
        }(url)
    }
    // ждем, когда горутина закончит работу
    wg.Wait()
}

В Python параллельное программирование также возможно с помощью модуля multiprocessing:

import urllib2
import multiprocessing


def f(url):
   req = urllib2.urlopen(url)
   try:
       print(len(req.read()))
   finally:
       req.close()


urls = ("https://www.peterbe.com", "https://python.org", "https://golang.org")


if __name__ == "__main__":
   p = multiprocessing.Pool(3)
   p.map(f, urls)

Args

Часто бывает необходимо получить аргументы переданные в команде терминала. Рассмотрим эту задачу на примере команды:

go run args.go peter anders bengt

Программа должна вернуть все три аргумента в верхнем регистре:

PETER
ANDERS
BENGT

В Python для разбора неопределенного количества неименованных параметров удобно воспользоваться синтаксисом *args. Список аргументов находится в sys.argv.

import sys


def transform(*args):
   for arg in args:
       print(arg.upper())


if __name__ == "__main__":
   transform(*sys.argv[1:])

В Go аргументы командной строки хранятся в os.Args:

package main

import (
  "fmt"
  "os"
  "strings"
)

func transform(args []string) {
  for _, arg := range args {
  fmt.Println(strings.ToUpper(arg))
}

}
func main() {
  args := os.Args[1:]
  transform(args)
}

Псевдонимы для импорта

В Python для импортируемых модулей можно использовать алиасы – короткие псевдонимы:

import string as s

print(s.upper("world"))

У языка Go тоже есть такая возможность:

package main

import (
  "fmt"
  s "strings"
)

func main() {
  fmt.Println(s.ToUpper("world"))
}

Конечно, вы обычно не используете псевдонимы для встроенных модулей с короткими именами, но вот здесь, например, это может быть удобно:

import (
   pb "github.com/golang/groupcache/groupcachepb"
)

Также можно импортировать пакеты, которые фактически не будут использоваться:

import (
   _ "image/png"  
)

Быстрое форматирование строк

Строки не всегда нужно печатать, иногда требуется просто быстро их отформатировать и передать, куда следует. В Python для этого есть простая функция f:

max = 10
raise Exception(f"The max. number is {max}")

В Golang для быстрого форматирования используется метод Sprintf модуля fmt:

package main

import "fmt"

func main() {
  max := 10
  panic(fmt.Sprintf("The max. number is %d", max))
}

Отбор уникальных значений

Задача убрать из коллекции все повторяющиеся элементы встречается очень часто. Python предлагает аккуратное решение, которое полностью зависит от типа, если значения поддерживают хэширование.

def uniqify(seq):
   seen = {}
   unique = []
   for item in seq:
       if item not in seen:
           seen[item] = 1
           unique.append(item)
   return unique


items = ["B", "B", "E", "Q", "Q", "Q"]
print(uniqify(items))  # prints ['B', 'E', 'Q']

А здесь вы можете найти самый быстрый способ унифицировать список в Python.

Вот аналогичный код для языка Go:

package main

import "fmt"

func uniqify(items []string) []string {
    uniq := make([]string, 0)
    seen := make(map[string]bool)

    // для большей эффективности:
    // seen := make(map[string]struct{})
    // https://stackoverflow.com/questions/37320287/maptstruct-and-maptbool-in-golang

    for _, i := range items {
        if _, exists := seen[i]; !exists {
        uniq = append(uniq, i)
        seen[i] = true
        }
    }

    return uniq
}

func main() {
    items := []string{"B", "B", "E", "Q", "Q", "Q"}
    items = uniqify(items)
    fmt.Println(items) // prints [B E Q]
}
Учиться новому проще на фундаменте имеющихся знаний. Сравнивая особенности Python и языка Go, мы находим множество сходств между ними. Это позволяет глубже понять концепции программирования и проще изучить новое.

Оригинальная статья

Книги по Go и другие полезные материалы:

изучение основ языка Go в сравнении с Python

Это не соревнование двух языков, а просто еще один способ обучения. Рассматриваем возможности языка Go, проводя параллели с Python.

Знаете Python? Бесплатные книги и другие туториалы по столь популярному языку программирования доступны повсеместно. Давайте же разберем на примере Python язык Go.

Go гораздо многословнее, чем Python. Чтобы сказать то же самое, ему требуется больше строк кода. Он меньше, чем Python, подходит для скриптового программирования, однако его популярность в этом качестве растет.

Hello World

Начнем с классики – незаменимой для обучения программы Hello World. В Python мы выводим легендарную фразу всего одной строчкой:

print("Hello world")

В Go придется приложить чуть больше усилий: указать имя главного пакета, подключить модуль fmt и оформить функцию main:

package main


import "fmt"


func main() {
  fmt.Println("Hello world")
}

Вывод данных

Продолжим с выводом и решим три фундаментальные задачи:

  • вывод строки с переходом на следующую строку;
  • вывод строки без перехода на следующую строку;
  • форматированный вывод.

В Python все три вещи может сделать единственная функция print:

print("Some string")
print("Some string", end="")
print("Name: {}, Age: {}".format("Peter", 35))

У языка Go есть три разных метода:

package main

import "fmt"

func main() {
  fmt.Println("Some string")
  fmt.Print("Some string")
  fmt.Printf("Name: %s, Age: %d\n", "Peter", 35)
}

Комментарии

Комментарии – важная часть документации кода, и программирование на Go – не исключение.

В языке Python они выглядят так:

"""doc string для целого модуля"""

# строчный комментарий

class Class(object):
   """doc string для класса"""


print(__doc__)
print(Class.__doc__)

Язык программирования Go предлагает широко распространенный синтаксис комментирования:

package main

// обычный строчный комментарий


/* тоже комментарий

 только на несколько строк
*/

/* Многострочный комментарий для функции main().
  Чтобы увидеть его, запустите в консоли команду:

    godoc comments.go

*/

func main() {
}

Многострочные блоки

В языке программирования Python за многострочность отвечают тройные кавычки. Также для оформления строк можно использовать двойные и одинарные кавычки.

print(
   """Это
многострочная строка.
"""
)
print("O'word " 'Another "word" ' "Last word.")

В Golang для строк используются двойные кавычки, следовательно, сам символ двойной кавычки внутри строки нужно экранировать. Многострочность обеспечивают обратные кавычки.

package main

import "fmt"

func main() {
  fmt.Println(`Это
    многострочная строка.
  `)
  fmt.Println(
    "O'word " +
    "Another \"word\" " +
    "Last word.")
}

Списки

Срез (slice) – это последовательность элементов, длина которой может изменяться. Основное различие между массивом и срезом состоит в том, что, работая с массивом, вы должны знать его размер.

Списки в Python:

# инициализируем список
numbers = [0] * 5
# изменяем один элемент
numbers[2] = 100
some_numbers = numbers[1:3]
print(some_numbers)  # [0, 100]
# получаем размер
print(len(numbers))  # 5

# инициализируем другой список
scores = []
scores.append(1.1)
scores[0] = 2.2
print(scores)  # [2.2]

У языка Go нет способа так же легко добавлять значения в существующий срез, поэтому вы можете инициализировать срез с максимальной длиной и постепенно добавлять в него элементы.

package main

import "fmt"

func main() {
    // инициализируем массив
    var numbers [5]int // [0, 0, 0, 0, 0]
    // меняем один элемент
    numbers[2] = 100
    // создаем срез из массива
    some_numbers := numbers[1:3]
    fmt.Println(some_numbers) // [0, 100]
    // получаем размер
    fmt.Println(len(numbers))

    // инициализируем срез
    var scores []float64
    scores = append(scores, 1.1) // пересоздаем, чтобы добавить элемент
    scores[0] = 2.2              // изменяем
    fmt.Println(scores)          // [2.2]

    // когда вы точно не знаете, сколько элементов
    // собираетесь положить в срез, можно сделать так
    var things [100]string
    things[0] = "Peter"
    things[1] = "Anders"
    fmt.Println(len(things)) // 100
}

Ассоциативные массивы

В ассоциативных массивах ключ может иметь нечисловое значение.

В Python эту функцию выполняют словари (dictionaries):

elements = {}
elements["H"] = 1
print(elements["H"])  # 1

# удалить по ключу
elements["O"] = 8
elements.pop("O")

# проверка наличия ключа

if "O" in elements:
   print(elements["O"])
if "H" in elements:
   print(elements["H"])

В Go для этой же цели мы можем использовать отображения:

package main

import "fmt"

func main() {
    elements := make(map[string]int)
    elements["H"] = 1
    fmt.Println(elements["H"])

    // удаление по ключу
    elements["O"] = 8
    delete(elements, "O")

    // сделать что-то с элементом, если он есть в отображении
    if number, ok := elements["O"]; ok {
        fmt.Println(number) // не будет выведено }
    if number, ok := elements["H"]; ok {
        fmt.Println(number) // 1
    }
}

В Golang даже можно создать отображение отображений:

elements : make(map[string]map[string]int)
elements["H"] = map[string]int{
   "protons": 1,
   "neutrons": 0,
}

Но помните, что для этой цели существует struct.

Логические значения

В Python внутри условия if можно использовать выражения с разными типами данных – в большинстве случаев они автоматически конвертируются в логическое значение True или False:

x = 1
if x:
   print "Yes"
y = []
if y:
   print "не будет выведено"

print(True and False)  # False
print(True or False)  # True
print(not True)  # False

У языка Go нет быстрого способа оценить истинность выражения, поэтому приходится делать это явно для каждого типа данных:

package main

import "fmt"

func main() {

  x := 1
  if x != 0 {
    fmt.Println("Yes")
  }
  var y []string
  if len(y) != 0 {
    fmt.Println("не будет выведено")
  }

  fmt.Println(true && false) // false
  fmt.Println(true || false) // true
  fmt.Println(!true)         // false

}

В этих примерах также видна работа основных логических операторов.

Циклы

В Python существует несколько видов циклов:

i = 1
while i <= 10:
   print(i)
   i += 1

# ...или...

for i in range(1, 11):
   print(i)

В языке программирования Go – всего один, и это цикл for:

package main

import "fmt"

func main() {
    i := 1
    for i <= 10 {
        fmt.Println(i)
        i += 1
    }

    // то же самое, но немного удобнее

    for i := 1; i <= 10; i++ {
        fmt.Println(i)
    }
}

Перебор элементов

Цикл for можно использовать для перебора элементов коллекции и в Python:

names = ["Peter", "Anders", "Bengt"]
for i, name in enumerate(names):
   print("{}. {}".format(i + 1, name))

и в Go:

package main

import "fmt"

func main() {
  names := []string{
    "Peter",
    "Anders",
    "Bengt",
  }
  /* будет выведено:

  1. Peter
  2. Anders
  3. Bengt
  */
  for i, name := range names {
    fmt.Printf("%d. %s\n", i+1, name)
  }
}

Switch

Множественные условия могут быть определены с помощью конструкции switch.

В Python она выглядит так:

def input_():
   return int(input())


number = input_()
if number == 8:
   print("Oxygen")
elif number == 1:
   print("Hydrogen")
elif number == 2:
   print("Helium")
elif number == 11:
   print("Sodium")
else:
   print("I have no idea what %d is" % number)


# Альтернативное решение
number = input_()
db = {1: "Hydrogen", 2: "Helium", 8: "Oxygen", 11: "Sodium"}
print(db.get(number, "I have no idea what %d is" % number))

А вот вариант кода для Go:

package main

import (
    "fmt"
    "strconv"
)

func str2int(s string) int {
    i, err := strconv.Atoi(s)
    if err != nil {
        panic("Not a number")
    }
    return i
}

func main() {
    var number_string string
    fmt.Scanln(&number_string)
    number := str2int(number_string)

    switch number {
        case 8:
        fmt.Println("Oxygen")
        case 1:
        fmt.Println("Hydrogen")
        case 2:
        fmt.Println("Helium")
        case 11:
        fmt.Println("Sodium")
        default:
        fmt.Printf("I have no idea what %d is\n", number)
    }

    // Альтернативное решение

    fmt.Scanln(&number_string)
    db := map[int]string{
        1:  "Hydrogen",
        2:  "Helium",
        8:  "Oxygen",
        11: "Sodium",
    }
    number = str2int(number_string)
    if name, exists := db[number]; exists {
        fmt.Println(name)
    } else {
        fmt.Printf("I have no idea what %d is\n", number)
    }

}

Как видно из примеров, оба языка предлагают более удобные альтернативные решения задачи с использованием ассоциативных массивов.

Вариативные функции

В Python функции могут принимать переменное число аргументов различных типов с помощью somefunction (*args).

def average(*numbers):
   return sum(numbers) / len(numbers)


print(average(1, 2, 3, 4))  # 10/4 = 2.5

В Go так нельзя. Однако есть возможность указать параметр, представляющий собой неопределенное количество значений одного конкретного типа:

package main

import "fmt"

func average(numbers ...float64) float64 {
  total := 0.0
  for _, number := range numbers {
    total += number
  }
  return total / float64(len(numbers))
}

func main() {
  fmt.Println(average(1, 2, 3, 4)) // 2.5
}

Измерение времени

В Python методы работы со временем собраны в модуле time:

import time

t0 = time.time()
time.sleep(3.5) 
t1 = time.time()
print("Took {:.2f} seconds".format(t1 - t0))

В языке программирования Go, как ни странно, тоже есть такой модуль:

package main

import "fmt"
import "time"

func main() {
  t0 := time.Now()
  elapsed := time.Since(t0)
  fmt.Printf("Took %s", elapsed)
}

Замыкания функций

Внутри одной функции можно спрятать другую, так что она становится недоступной для внешнего кода.

Вот так можно реализовать замыкание в Python:

def run():
   def increment(amount):
       return number + amount

   number = 0
   number = increment(1)
   number = increment(2)
   print(number)  # 3


run()

Обратите внимание, что используемая во внутренней функции переменная number доступна из скоупа внешней функции. Если бы ее там не было, возникла бы ошибка UnboundLocalError.

def increment(amount):
   number += amount
increment(1)
increment(2)

Нужную переменную можно объявить прямо внутри increment. А чтобы она была доступна на внешнем уровне, используется ключевое слово global.

def increment(amount):
   global number
   number += amount
increment(1)
increment(2)

А вот пример замыкания в Golang:

package main

import "fmt"

func main() {

    number := 0

    /* Это должна быть именно локальная переменная.
      Нельзя написать `func increment(amount int) {` */
    increment := func(amount int) {
        number += amount
    }
    increment(1)
    increment(2)

    fmt.Println(number) // 3

}

Defer

В Go defer имеет замечательный синтаксис. Отложенная операция стоит сразу после ключевого слова, так что смысл конструкции сразу же становится очевиден:

package main

import (
  "os"
)

func main() {
  f, _ := os.Open("defer.py")
  defer f.Close()
  // теперь вы можете читать из f
  // он будет закрыт в конце программы
}

В Python вы можете добиться того же, поместив код в try-finally блок:

f = open("defer.py")
try:
   f.read()
finally:
   f.close()

Panic Recover

Чтобы сгенерировать и поймать ошибку, в Python используется ключевое слово raise и конструкция try-except:

try:
   raise Exception("Shit")
except Exception as e:
   print("error was:", e)

В Go для этого есть оператор panic и функция recover:

package main

import "fmt"

func main() {

  // будет выведено:
  // error was: Shit!
  defer func() {
    fmt.Println("error was:", recover())
  }()
  panic("Shit!")
}

Изменяемость

Передавая параметром в функцию сложные структуры, например, массив или мапу, вы можете изменить прямо внутри функции, и это автоматически изменится снаружи.

В Python:

def upone(mutable, index):
   mutable[index] = mutable[index].upper()


list_ = ["a", "b", "c"]
upone(list_, 1)
print(list_)  # ['a', 'B', 'c']

dict_ = {"a": "anders", "b": "bengt"}
upone(dict_, "b")
print(dict_)  # {'a': 'anders', 'b': 'BENGT'}

В Golang:

package main

import (
    "fmt"
    "strings"
)

func upone_list(thing []string, index int) {
    thing[index] = strings.ToUpper(thing[index])
}

func upone_map(thing map[string]string, index string) {
    thing[index] = strings.ToUpper(thing[index])
}

func main() {
    // mutable
    list := []string{"a", "b", "c"}
    upone_list(list, 1)
    fmt.Println(list) // [a B c]

    // mutable
    dict := map[string]string{
        "a": "anders",
        "b": "bengt",
    }
    upone_map(dict, "b")
    fmt.Println(dict) // map[a:anders b:BENGT]
}

Структуры

В Python для создания пользовательских наборов полей используются классы. Метод __init__ вызывается при создании экземпляра класса:

from math import sqrt


class Point(object):
   def __init__(self, x, y):
       self.x = x
       self.y = y


def distance(point1, point2):
   return sqrt(point1.x * point2.x + point1.y * point2.y)


p1 = Point(1, 3)
p2 = Point(2, 4)
print(distance(p1, p2))  # 3.74165738677

В Go существует специальное ключевое слово struct:

package main

import (
    "fmt"
    "math"
)

type Point struct {
    x float64
    y float64
}

func distance(point1 Point, point2 Point) float64 {
    return math.Sqrt(point1.x*point2.x + point1.y*point2.y)
}

// Так как структуры автоматически копируются при передаче,
// лучше передавать их в функцию как указатели

func distance_better(point1 *Point, point2 *Point) float64 {
    return math.Sqrt(point1.x*point2.x + point1.y*point2.y)
}

func main() {
    p1 := Point{1, 3}
    p2 := Point{2, 4}
    fmt.Println(distance(p1, p2))          // 3.7416573867739413
    fmt.Println(distance_better(&p1, &p2)) // 3.7416573867739413
}

Методы

В Python методы определяются прямо внутри классов с помощью ключевого слова def, и первым аргументом принимают ссылку на экземпляр класса:

from math import sqrt


class Point(object):
   def __init__(self, x, y):
       self.x = x
       self.y = y

   def distance(self, other):
       return sqrt(self.x * other.x + self.y * other.y)


p1 = Point(1, 3)
p2 = Point(2, 4)
print(p1.distance(p2))  # 3.74165738677
print(p2.distance(p1))  # 3.74165738677

Методы в Go – это функции, прикрепленные к какому-то конкретному типу. Его параметр обязательно указывается в сигнатуре метода:

package main

import (
    "fmt"
    "math"
)

type Point struct {
    x float64
    y float64
}

func (this Point) distance(other Point) float64 {
    return math.Sqrt(this.x*other.x + this.y*other.y)
}

func (this *Point) distance_better(other *Point) float64 {
    return math.Sqrt(this.x*other.x + this.y*other.y)
}

func main() {
    p1 := Point{1, 3}
    p2 := Point{2, 4}
    fmt.Println(p1.distance(p2))         // 3.7416573867739413
    fmt.Println(p1.distance_better(&p2)) // 3.7416573867739413
}

Горутины

Горутины языка Go – это независимые параллельные операции. Сама функция main является горутиной. Для их определения используется оператор go:

package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
    "sync"
)

func f(url string) {
    response, err := http.Get(url)
    if err != nil {
        panic(err)
    }
    defer response.Body.Close()
    body, err := ioutil.ReadAll(response.Body)
    if err != nil {
        panic(err)
    }

    fmt.Println(len(body))
}

// Смотрите пример на https://golang.org/pkg/sync/#WaitGroup
func main() {
    var wg sync.WaitGroup
    urls := []string{
        "https://www.peterbe.com",
        "https://python.org",
        "https://golang.org",
    }
    for _, url := range urls {
        wg.Add(1)
        go func(url string) {
            defer wg.Done()
            f(url)
        }(url)
    }
    // ждем, когда горутина закончит работу
    wg.Wait()
}

В Python параллельное программирование также возможно с помощью модуля multiprocessing:

import urllib2
import multiprocessing


def f(url):
   req = urllib2.urlopen(url)
   try:
       print(len(req.read()))
   finally:
       req.close()


urls = ("https://www.peterbe.com", "https://python.org", "https://golang.org")


if __name__ == "__main__":
   p = multiprocessing.Pool(3)
   p.map(f, urls)

Args

Часто бывает необходимо получить аргументы переданные в команде терминала. Рассмотрим эту задачу на примере команды:

go run args.go peter anders bengt

Программа должна вернуть все три аргумента в верхнем регистре:

PETER
ANDERS
BENGT

В Python для разбора неопределенного количества неименованных параметров удобно воспользоваться синтаксисом *args. Список аргументов находится в sys.argv.

import sys


def transform(*args):
   for arg in args:
       print(arg.upper())


if __name__ == "__main__":
   transform(*sys.argv[1:])

В Go аргументы командной строки хранятся в os.Args:

package main

import (
  "fmt"
  "os"
  "strings"
)

func transform(args []string) {
  for _, arg := range args {
  fmt.Println(strings.ToUpper(arg))
}

}
func main() {
  args := os.Args[1:]
  transform(args)
}

Псевдонимы для импорта

В Python для импортируемых модулей можно использовать алиасы – короткие псевдонимы:

import string as s

print(s.upper("world"))

У языка Go тоже есть такая возможность:

package main

import (
  "fmt"
  s "strings"
)

func main() {
  fmt.Println(s.ToUpper("world"))
}

Конечно, вы обычно не используете псевдонимы для встроенных модулей с короткими именами, но вот здесь, например, это может быть удобно:

import (
   pb "github.com/golang/groupcache/groupcachepb"
)

Также можно импортировать пакеты, которые фактически не будут использоваться:

import (
   _ "image/png"  
)

Быстрое форматирование строк

Строки не всегда нужно печатать, иногда требуется просто быстро их отформатировать и передать, куда следует. В Python для этого есть простая функция f:

max = 10
raise Exception(f"The max. number is {max}")

В Golang для быстрого форматирования используется метод Sprintf модуля fmt:

package main

import "fmt"

func main() {
  max := 10
  panic(fmt.Sprintf("The max. number is %d", max))
}

Отбор уникальных значений

Задача убрать из коллекции все повторяющиеся элементы встречается очень часто. Python предлагает аккуратное решение, которое полностью зависит от типа, если значения поддерживают хэширование.

def uniqify(seq):
   seen = {}
   unique = []
   for item in seq:
       if item not in seen:
           seen[item] = 1
           unique.append(item)
   return unique


items = ["B", "B", "E", "Q", "Q", "Q"]
print(uniqify(items))  # prints ['B', 'E', 'Q']

А здесь вы можете найти самый быстрый способ унифицировать список в Python.

Вот аналогичный код для языка Go:

package main

import "fmt"

func uniqify(items []string) []string {
    uniq := make([]string, 0)
    seen := make(map[string]bool)

    // для большей эффективности:
    // seen := make(map[string]struct{})
    // https://stackoverflow.com/questions/37320287/maptstruct-and-maptbool-in-golang

    for _, i := range items {
        if _, exists := seen[i]; !exists {
        uniq = append(uniq, i)
        seen[i] = true
        }
    }

    return uniq
}

func main() {
    items := []string{"B", "B", "E", "Q", "Q", "Q"}
    items = uniqify(items)
    fmt.Println(items) // prints [B E Q]
}
Учиться новому проще на фундаменте имеющихся знаний. Сравнивая особенности Python и языка Go, мы находим множество сходств между ними. Это позволяет глубже понять концепции программирования и проще изучить новое.

Оригинальная статья

Книги по Go и другие полезные материалы:

Священный холивар «Python vs Go» / Хабр

Выбери, на какой стороне ты, и встань на защиту своего любимого языка в решающей битве на Russian Python Week.

Что будет?

Бескомпромиссная интеллектуальная битва двух противоборствующих лагерей. Никто заранее не знает, кто победит.

Холивар «Python vs Go» на Russian Python Week не будет:

  • мнением одного «эксперта»;
  • выступлением одного спикера, в котором, пускай и аргументированно, победитель заранее известен;
  • сравнением на синтетических тестах;
  • набором бенчамрков, которые заведомо выгодны для одного участника.

Битву начнут два представителя Python- и Go-сообщества, но каждый участник сможет повлиять на её ход. Конечное решение останется за вами.

Зачем?

Чтобы раз и навсегда выяснить, какое сообщество сильнее — питонисты или гоферы.

Тема «Python против Go» — регулярно поднимается в чатиках и на встречах программистов. В таких спорах бывает весело участвовать, но они никогда ничем путным не заканчиваются. Да и какие могут быть выводы, если зачинщик написал свой первый код, например, на Go, восхитился, как легко у него это получилось, и теперь агитирует бросать Python. Или наоборот.

Но на Russian Python Week спор будут вести знатоки, и поэтому это будет не только увлекательно, но ещё и полезно. Акцентированные за и против с обеих сторон дадут взглянуть на вопрос под разными углами и позволят определить критерии выбора инструмента.

Как пройдет битва?

Жёстко, но справедливо.

Оппоненты будут опираться не только на объективные достоинства и недостатки, но и на свой субъективный опыт и, главное, на ваши аргументы. Участники нашего спора открыто выскажут свою точку зрения, а не будут сглаживать углы в попытке никого не обидеть. Никого не обидеть — это не про битву Python vs Go. У нас не будет стерильности или вымученной толерантности.

Кто участвует в битве?

Два крупнейших русскоязычных языковых сообщества. За Python выступают MoscowPython, PiterPy и региональные Python-сообщества. На стороне Go —

Golang Live

и сообщество разработчиков на Go. И по одному представителю от каждого языка, на которых мы возлагаем ответственную миссию отстаивать интересы сообщества.

За Python будет топить Александр Боргардт

Александр Боргардт последние 10 лет занимается исследованием новых подходов и созданием решений в областях рекламы, финтеха и ML. Интересуется разработкой распределенных систем, параллельной и конкурентной обработкой информации, улучшает мир, работая над open source-проектом

Cyber Duck Ninja

.

Промо-ролики защитника Python Александра Боргардта:

За Go сразится Филипп Кулин

Филипп Кулин почти 20 лет занимается хостингом, с весны 2018 года ведет мониторинг за блокировками Роскомнадзора — вы наверняка знакомы с его проектом

Эшер II

. У Филиппа большой опыт разработки и на Python, и на Go. Про Go Филипп сказал:

«Go я нежно люблю, разбирался с историей его создания, готов защитить даже откровенно слабые места»

.

Как раз, почему «так исторически сложилось», Филипп рассказывал на прошлой Golang Conf.

Как мне повлиять на исход сражения?

Участвовать в

Russian Python Week

14 — 18 сентября. Следить за холиваром, принимать аргументы противников и вбрасывать свои соображения, признавать недостатки, но находить точки роста, чтобы стать сильнее. Впитывать информацию и использовать её, чтобы расширить кругозор и стать лучшим профессионалом. Да и просто с азартом рубиться в чате участников и

голосовать за своего кандидата

.

И писать нам в комментариях или чате, по каким параметрам точно нужно сравнение и какие тезисы нельзя пропустить в холиваре.

И что в итоге?

Победит сильнейший! И отныне и во веки веков (то есть до следующей битвы или релиза новой версии одного из языков), мы будем знать,

кто круче — Python- или Go-разработчики

.

Мы сможем перестать тратить силы на холивары, а вместо этого вложиться в собственное развитие и развитие наших сообществ. Для новобранцев у нас будет аргумент: неоспоримое мнение большинства и летопись битвы «Python vs Go».

Вместо выводов:

  • Участвуйте в Russian Python Week, мы готовим много разного и для расширения кругозора, типа битвы против Go и PHP, и для углубления профессиональных навыков.
  • Следите за анонсами здесь, в телеграме или рассылке. Например, скоро объявим подробности о битве Python vs PHP, и если вы думаете, что тут и говорить не о чем и это будет легкая победа, то сильно ошибаетесь.
  • Участвуйте в Golang Live, если вам нет дела до питонистов, свой выбор вы уже сделали и обсуждать его не собираетесь.

48) Python против Go — CoderLessons.com

Что такое Голанг?

Go — это язык программирования с открытым исходным кодом, разработанный Google. Это статически скомпилированный язык. Этот язык поддерживает параллельное программирование, а также позволяет запускать несколько процессов одновременно. Это достигается с помощью каналов, подпрограмм и т. Д. Go имеет сборку мусора, которая сама выполняет управление памятью и обеспечивает отложенное выполнение функций.

В этом уроке Go vs. Python вы узнаете:

Что такое Python?

Python — это высокоуровневый объектно-ориентированный язык программирования. Он имеет встроенные структуры данных в сочетании с динамическим связыванием и типизацией, что делает его идеальным выбором для быстрой разработки приложений. Python также предлагает поддержку модулей и пакетов, что позволяет использовать модульность системы и повторное использование кода.

Это один из самых быстрых языков программирования, так как он требует очень мало строк кода. Акцент делается на удобочитаемости и простоте, что делает его отличным выбором для начинающих.

Тенденции переполнения стека GO vs. Python

Зачем использовать язык GO?

Вот важные причины использования языка Go:

  • Это позволяет использовать статическое связывание для объединения всех библиотек зависимостей и модулей в один двоичный файл в зависимости от типа ОС и архитектуры.
  • Язык Go работает более эффективно благодаря масштабируемости процессора и модели параллелизма.
  • Язык Go предлагает поддержку нескольких библиотек и инструментов, поэтому он не требует сторонних библиотек.
  • Это статически строго типизированный язык программирования с отличным способом обработки ошибок

Зачем использовать язык Python?

Вот причины использования языка Python:

  • Python — это мощный объектно-ориентированный язык программирования.
  • Использует элегантный синтаксис, облегчая чтение написанной вами программы.
  • Python поставляется с большой стандартной библиотекой, поэтому он поддерживает множество общих задач программирования.
  • Работает на различных типах компьютеров и операционных систем: Windows, macOS, Unix, OS / 2 и т. Д.
  • Очень простой синтаксис по сравнению с языками Java, C и C ++.
  • Обширная библиотека и удобные инструменты для разработчиков
  • Python имеет свою автоматически установленную оболочку
  • По сравнению с кодом других языков, код на Python прост в написании и отладке. Поэтому его исходный код относительно прост в обслуживании.
  • Python является переносимым языком, поэтому он может работать на самых разных операционных системах и платформах.
  • Python поставляется с множеством встроенных библиотек, что облегчает задачу разработки.
  • Python помогает вам упростить сложное программирование. Поскольку это внутренне имеет дело с адресами памяти, сборка мусора.
  • Python предоставляет интерактивную оболочку, которая помогает вам тестировать вещи до их фактической реализации.
  • Python предлагает интерфейсы баз данных для всех основных коммерческих систем СУБД.

Google Trends GO vs. Python

Особенности Go

Здесь важны особенности языка Go

  • Проект с открытым исходным кодом
  • Создано в Google
  • Скомпилированный язык
  • Простая поддержка параллелизма через goroutines
  • Управление пакетами
  • Статическая печать
  • Особенности мощной стандартной библиотеки
  • Сборка мусора называется goLand
  • Поддержка параллелизма
  • Великие библиотеки
  • Простой и читаемый код

Особенности Python

Здесь важны особенности Python

  • Легко учиться, читать и поддерживать
  • Он может работать на различных аппаратных платформах и использовать один и тот же интерфейс.
  • Вы можете включить низкоуровневые модули в интерпретатор Python.
  • Python предлагает идеальную структуру и поддержку для больших программ.
  • Python предлагает поддержку автоматической сборки мусора.
  • Поддерживает интерактивный режим тестирования и отладки.
  • Он предлагает высокоуровневые динамические типы данных, а также поддерживает динамическую проверку типов.
  • Язык Python может быть интегрирован с программным кодом Java, C и C ++
  • Высокая производительность
  • Простой, минимальный синтаксис
  • Быстрое время компиляции
  • Статически связанные двоичные файлы, которые просты в развертывании

Голанг против Питона

Вот основные различия между Go и Python:

Идтипитон
Парадигмы Go — это процедурный, функциональный и параллельный язык.Парадигмы Python являются объектно-ориентированным, императивным, функциональным и процедурным языком.
Статически типизированный языкДинамически типизированный язык
Больше сосредоточено на том, чтобы быть системным языком.Больше внимания уделяется написанию веб-приложений.
Go также занимается управлением памятью.Python предлагает управление памятью.
Синтаксис Go основан на открывающей и закрывающей скобках.Синтаксис Python использует отступы для обозначения блоков кода.
Go веб-программирование предлагает плавный процесс отладки.Python динамически типизирован, что означает, что он проверяет наличие ошибок во время выполнения.
Предлагает ограниченную поддержку объектной ориентации и функциональных концепцийОбъектно-ориентированное программирование, которое поддерживает функциональные концепции
Go не дает исключений.Python поддерживает исключения.
Go не поддерживает объектно-ориентированное программирование. Поэтому у него нет классов и объектов.Python имеет классы и объекты.
Go не поддерживает наследование.Python поддерживает наследование.
Go идеально подходит для системного программирования.Python является популярным языком, который используется для решения проблем науки о данных
Он более многословен по сравнению с Python.Это менее многословно по сравнению с языком го.
Поддерживает параллелизм.У него нет встроенного механизма параллелизма.
Язык Go больше ориентирован на то, чтобы быть системным языком.Язык Python больше ориентирован на написание веб-приложений.
Go требуется больше кода для выполнения того же количества действий.Python требует меньше кода для сравнения с Go.
28,5 K звезд Github67,5 K звезд Github.
Go Developer варьируется от $ 64,089 в годСредняя зарплата для разработчика на Python в Соединенных Штатах составляет 120 359 долларов в год.

Недостатки ГО

Вот минусы / недостатки использования языка GO:

  • Go не является родовым языком
  • Интеграция API с Go не имеет официально поддерживаемого Go SDK.
  • Плохая поддержка библиотеки
  • Управление зависимостями

Недостатки Python

Вот минусы / недостатки использования языка Python:

  • Используется на меньшем количестве платформ.
  • Слабый в мобильных вычислениях, следовательно, не используется в разработке приложений
  • Как Python является динамическим, так он показывает больше ошибок во время выполнения
  • Слаборазвитый и примитивный уровень доступа к базе данных
  • Отсутствие коммерческой поддержки

ОСНОВНЫЕ РАЗЛИЧИЯ:

  • Go — это процедурный, функциональный и параллельный язык, в то время как Python — это объектно-ориентированный, императивный, функциональный и процедурный язык.
  • Go поддерживает параллелизм, с другой стороны, Python не имеет встроенного механизма параллелизма.
  • Go идеально подходит для системного программирования, в то время как Python является популярным языком, который используется для решения задач науки о данных.
  • Go не предоставляет исключений, тогда как Python поддерживает исключения.
  • Go не поддерживает наследование, а Python поддерживает наследование.

 

Python vs Go: в чем разница?

  • Home
  • Тестирование

      • Back
      • Agile Testing
      • BugZilla
      • Cucumber
      • Тестирование базы данных
      • Тестирование ETL
      • 0003
      • Jmeter
      • Jmeter Load Backing
      • Ручное тестирование
      • Мобильное тестирование
      • Mantis
      • Почтальон
      • QTP
      • Назад
      • Центр качества (ALM)
      • RPA
      • SAP Testing
      • Selenium
    • SAP

        • Назад
        • ABAP
        • APO
        • Начало er
        • Basis
        • BODS
        • BI
        • BPC
        • CO
        • Назад
        • CRM
        • Crystal Reports
        • FICO
        • Pay4
        • HR
        • Назад

        • PI / PO
        • PP
        • SD
        • SAPUI5
        • Безопасность
        • Менеджер решений
        • Successfactors
        • SAP Tutorials
    • Назад

      Web

        • Angular

          Web

            • ASP.Net
            • C
            • C #
            • C ++
            • CodeIgniter
            • СУБД
            • JavaScript
            • Назад
            • Java
            • JSP
            • Kotlin
            • Linux
            • Linux
            • Kotlin
            • Linux
            • js

            • Perl
            • Назад
            • PHP
            • PL / SQL
            • PostgreSQL
            • Python
            • ReactJS
            • Ruby & Rails
            • Scala
            • SQL
            • 000

            • SQL
            • 000

              0003 SQL

              000

              0003 SQL

              000

            • UML
            • VB.Net
            • VBScript
            • Веб-службы
            • WPF
        • Обязательно учите!

            • Назад
            • Бухгалтерский учет
            • Алгоритмы
            • Android
            • Блокчейн
            • Business Analyst
            • Создание веб-сайта
            • CCNA
            • Облачные вычисления
            • 00030003 COBOL 9000 Compiler
                9000 Встроенные системы

              • 00030002 9000 Compiler 9000
              • Ethical Hacking
              • Учебники по Excel
              • Программирование на Go
              • IoT
              • ITIL
              • Jenkins
              • MIS
              • Сеть
              • Операционная система
              • Назад
              • Управление проектами Обзоры
              • Salesforce
              • SEO
              • Разработка программного обеспечения
              • VB A
          • Big Data

              • Назад
              • AWS
              • BigData
              • Cassandra
              • Cognos
              • Хранилище данных
              • 0003

              • HBOps
              • 0003

              • HBOps
              • MicroStrategy
              • MongoDB

          .

          Go против Python Learning Go, сравнивая, как вы это делаете в Python

          верхний

          Привет, мир

          🔗

          Вперед
           основной пакет
          
          импорт "fmt"
          
          func main () {
          fmt.Println ("Привет, мир")
          }
           

          Верх

          Печать

          🔗

          Питон
           print ("Немного нить")
          print ("Some string", end = "") # не печатается символ новой строки
          print ("Имя: {}, Возраст: {}".format ("Питер", 35))
           
          Вперед
           основной пакет
          
          импорт "fmt"
          
          func main () {
          fmt.Println ("Немного строки")
          fmt.Print ("Немного строки")
          fmt.Printf ("Имя:% s, Возраст:% d \ n", "Питер", 35)
          }
           


          Верх

          Многострочные струны

          🔗

          Питон
           печать (
              """Это
          многострочная строка."" "
          )
          print ("O'word" 'Другое "слово"' "Последнее слово.")
           
          Вперед
           основной пакет
          
          импорт "fmt"
          
          func main () {
          fmt.Println (`Это
          многострочная строка.
          `)
          fmt.Println (
          "O'word" +
          "Другое \" слово \ "" +
          "Последнее слово.")
          }
           

          Верх

          Списки

          🔗

          Срез — это сегмент массива, длина которого может изменяться.

          Основное различие между массивом и срезом заключается в том, что
          массив, вам нужно знать размер заранее. В Go нет возможности
          одинаково легко добавлять значения к существующему срезу , поэтому, если вы хотите
          легко добавлять значения, вы можете инициализировать срез максимальной длины и
          постепенно добавляйте к нему вещи.

          Питон
           # инициализировать список
          числа = [0] * 5
          # изменить одно из них
          числа [2] = 100
          some_numbers = числа [1: 3]
          print (some_numbers) # [0, 100]
          # длина
          print (len (числа)) # 5
          
          # инициализировать другой
          оценки = []
          оценки.добавить (1.1)
          баллы [0] = 2,2
          печать (баллы) # [2.2]
           
          Вперед
           основной пакет
          
          импорт "fmt"
          
          func main () {
          // инициализированный массив
          var numbers [5] int // становится [0, 0, 0, 0, 0]
          // меняем один из них
          числа [2] = 100
          // создаем новый срез из массива
          some_numbers: = числа [1: 3]
          fmt.Println (some_numbers) // [0, 100]
          // длина
          fmt.Println (len (числа))
          
          // инициализируем срез
          var scores [] float64
          оценки = добавить (оценки, 1.1) // воссоздать, чтобы добавить
          scores [0] = 2.2 // передумали
          fmt.Println (scores) // выводит [2.2]
          
          // когда вы точно не знаете, сколько собираетесь
          // чтобы вставить, можно
          var things [100] строка
          things [0] = "Питер"
          things [1] = "Андерс"
          fmt.Println (len (вещи)) // 100
          }
           

          Верх

          Карты

          🔗

          Вы можете сделать карту карт с помощью:

           элементов: make (map [строка] map [строка] int)
          elements ["H"] = map [строка] int {
              «протоны»: 1,
              «нейтроны»: 0,
          }
           

          Но обратите внимание, это то, для чего у вас есть структура .

          Питон
           элементов = {}
          элементы ["H"] = 1
          print (elements ["H"]) # 1
          
          # удалить по ключу
          элементы ["O"] = 8
          elements.pop ("O")
          
          # делаем что-нибудь в зависимости от того, кто там находится
          если "O" в элементах:
              print (элементы ["O"])
          если "H" в элементах:
              print (элементы ["H"])
           
          Вперед
           основной пакет
          
          импорт "fmt"
          
          func main () {
          элементы: = make (map [строка] int)
          элементы ["H"] = 1
          fmt.Println (элементы ["H"])
          
          // удалить по ключу
          элементы ["O"] = 8
          удалить (элементы, "O")
          
          // только что-то делаем с элементом, если он на карте
          если число, нормально: = элементы ["O"]; в порядке {
          fmt.Println (number) // не будет печататься
          }
          если число, нормально: = элементы ["H"]; в порядке {
          fmt.Println (число) // 1
          }
          
          }
           

          Верх

          логические значения

          🔗

          Go не позволяет быстро оценить,
          «правда».
          В Python, например, вы можете использовать оператор if для любого типа и
          у большинства типов есть способ автоматического преобразования в True или
          Неверно .Например, вы можете сделать:

           х = 1
          если x:
              печать "Да"
          y = []
          если y:
              напечатать "это не будет напечатано"
           

          Это невозможно в Go. Вам действительно нужно сделать это явно для
          каждого типа:

           х: = 1
          if x! = 0 {
              fmt.Println («Да»)
          }
          var y [] строка
          if len (y)! = 0 {
              fmt.Println («это не будет напечатано»)
          }
           
          Питон
           print (True или False) # False
          print (Верно или Ложь) # Верно
          print (not True) # False
           
          Вперед
           основной пакет
          
          импорт "fmt"
          
          func main () {
          fmt.Println (true && false) // ложь
          fmt.Println (true || false) // правда
          fmt.Println (! true) // ложь
          
          х: = 1
          if x! = 0 {
          fmt.Println («Да»)
          }
          var y [] строка
          if len (y)! = 0 {
          fmt.Println («это не будет напечатано»)
          }
          
          }
           

          Верх

          Forloop

          🔗

          Go имеет только один тип петли, и это петля для .

          Питон
           я = 1
          пока я <= 10:
              печать (я)
              я + = 1
          
          #...или...
          
          для i в диапазоне (1, 11):
              печать (я)
           
          Вперед
           основной пакет
          
          импорт "fmt"
          
          func main () {
          я: = 1
          for i <= 10 {
          fmt.Println (i)
          я + = 1
          }
          
          // то же самое, но более удобное
          для i: = 1; я <= 10; i ++ {
          fmt.Println (i)
          }
          }
           

          Верх

          Диапазон

          🔗

          Питон
           names = ["Питер", "Андерс", "Бенгт"]
          для i имя в перечислении (имена):
              Распечатать("{}.{} ". формат (i + 1, имя))
           
          Вперед
           основной пакет
          
          импорт "fmt"
          
          func main () {
          names: = [] строка {
          "Питер",
          "Андерс",
          "Бенгт",
          }
          / * Это напечатает
          
          1. Петр
          2. Андерс
          3. Бенгт
          * /
          для i, name: = имена диапазонов {
          fmt.Printf ("% d.% s \ n", i + 1, имя)
          }
          }
           

          Верх

          Переключатель

          🔗

          Питон
           по умолчанию input_ ():
              вернуть int (input ())
          
          
          число = input_ ()
          если число == 8:
              print ("Кислород")
          число elif == 1:
              print («Водород»)
          число elif == 2:
              print («Гелий»)
          число elif == 11:
              print («Натрий»)
          еще:
              print ("Понятия не имею, что такое% d"% number)
          
          
          # Альтернативное решение
          число = input_ ()
          db = {1: «Водород», 2: «Гелий», 8: «Кислород», 11: «Натрий»}
          печать (дб.get (number, "Понятия не имею, что такое% d"% number))
           
          Вперед
           основной пакет
          
          импорт (
          "fmt"
          "strconv"
          )
          
          func str2int (s строка) int {
          i, err: = strconv.Atoi (s)
          if err! = nil {
          паника ("Не число")
          }
          вернуть я
          }
          
          func main () {
          var number_string строка
          fmt.Scanln (& number_string)
          число: = str2int (строка_числа)
          
          номер переключателя {
          case 8:
          fmt.Println («Кислород»)
          Случай 1:
          fmt.Println («Водород»)
          случай 2:
          fmt.Println («Гелий»)
          case 11:
          fmt.Println («Натрий»)
          дефолт:
          fmt.Printf ("Понятия не имею, что такое% d \ n", число)
          }
          
          // Альтернативное решение
          
          fmt.Scanln (& number_string)
          db: = map [int] string {
          1: «Водород»,
          2: «Гелий»,
          8: «Кислород»,
          11: «Натрий»,
          }
          число = str2int (строка_числа)
          если имя существует: = db [число]; существует {
          fmt.Println (имя)
          } else {
          fmt.Printf ("Понятия не имею, что такое% d \ n", число)
          }
          
          }
           

          Верх

          Функции с переменными числами

          🔗

          В Python вы можете принимать различные типы с помощью somefunction (* args) , но
          это невозможно с Go.Однако вы можете сделать тип
          интерфейс, таким образом, можно получить гораздо более богатые структуры типов.

          Питон
           по умолчанию (* числа):
              возврат суммы (числа) / len (числа)
          
          
          print (среднее (1, 2, 3, 4)) # 10/4 = 2,5
           
          Вперед
           основной пакет
          
          импорт "fmt"
          
          func average (numbers ... float64) float64 {
          всего: = 0,0
          for _, number: = диапазон чисел {
          итого + = число
          }
          вернуть итог / float64 (len (числа))
          }
          
          func main () {
          fmt.Println (среднее (1, 2, 3, 4)) // 2,5
          }
           

          Верх

          Истекшее время

          🔗

          Питон
           время импорта
          
          t0 = время. время ()
          time.sleep (3.5) # например
          t1 = time.time ()
          print ("Принято {: .2f} секунд" .format (t1 - t0))
           
          Вперед
           основной пакет
          
          импорт "fmt"
          импорт "время"
          
          func main () {
          t0: = время.Сейчас()
          истекло: = время с (t0)
          fmt.Printf ("Принято% s", прошло)
          }
           

          Верх

          Функции закрытия

          🔗

          Обратите внимание, что в примере Python вы можете получить доступ к номеру во внутренней функции
          но вы не можете это изменить. Предположим, вы хотите сделать это:

           def приращение (количество):
              число + = сумма
          инкремент (1)
          инкремент (2)
           

          Тогда вы получите ошибку UnboundLocalError , потому что переменная
          будет привязан к внутренней области видимости функции приращения .

          Примечание: вы можете использовать глобальный оператор , чтобы обойти это, например

           def приращение (количество):
              глобальный номер
              число + = сумма
          инкремент (1)
          инкремент (2)
           
          Питон
           def run ():
              def приращение (количество):
                  номер возврата + сумма
          
              число = 0
              число = приращение (1)
              число = приращение (2)
              печать (число) # 3
          
          
          пробег()
           
          Вперед
           основной пакет
          
          импорт "fmt"
          
          func main () {
          
          число: = 0
          
          / * Это должна быть такая локальная переменная.Вы не можете выполнить `func increment (amount int) {` * /
          инкремент: = func (amount int) {
          число + = сумма
          }
          инкремент (1)
          инкремент (2)
          
          fmt.Println (число) // 3
          
          }
           

          Верх

          Отложить

          🔗

          Самое замечательное в defer в Go заключается в том, что вы можете ввести это рядом с
          где это имеет значение, и тогда читателю ясно, что это будет делать
          это позже.

          В Python вы можете добиться того же, сохраняя содержимое
          между попыткой : и, наконец, : коротким блоком .

          Питон
           f = open ("defer.py")
          пытаться:
              f.read ()
          Ну наконец то:
              f.close ()
           
          Вперед
           основной пакет
          
          импорт (
          "Операционные системы"
          )
          
          func main () {
          f, _: = os.Open ("defer.py")
          отложить f.Close ()
          // теперь вы можете читать из этого
          // вещь `f` и она будет закрыта позже
          
          }
           

          Верх

          Восстановление после паники

          🔗

          Питон
           попробуйте:
              поднять исключение ("Дерьмо")
          кроме исключения как e:
              print ("была ошибка:", e)
           
          Вперед
           основной пакет
          
          импорт "fmt"
          
          func main () {
          
          // Выполнение этого распечатает:
          // ошибка была: Дерьмо!
          defer func () {
          fmt.Println ("была ошибка:", recovery ())
          } ()
          паника («Черт!»)
          }
           

          Верх

          Изменчивые

          🔗

          Python не имеет концепции указателей. Go делает. Но с Go вы
          может отправить массив или карту в функцию, изменить ее там
          без возврата, и он меняется.

          Питон
           def upone (изменяемый, индекс):
              изменяемый [индекс] = изменяемый [индекс].верхний ()
          
          
          list_ = ["a", "b", "c"]
          upone (список_, 1)
          print (list_) # ['a', 'B', 'c']
          
          dict_ = {"a": "anders", "b": "bengt"}
          upone (dict_, "б")
          print (dict_) # {'a': 'anders', 'b': 'BENGT'}
           
          Вперед
           основной пакет
          
          импорт (
          "fmt"
          "струны"
          )
          
          func upone_list (thing [] строка, индекс int) {
          вещь [индекс] = strings.ToUpper (вещь [индекс])
          }
          
          func upone_map (карта объекта [строка] строка, строка индекса) {
          вещь [индекс] = strings.ToUpper (вещь [индекс])
          }
          
          func main () {
          // изменяемый
          list: = [] строка {"a", "b", "c"}
          upone_list (список, 1)
          fmt.Println (список) // [a B c]
          
          // изменяемый
          dict: = map [строка] строка {
          "а": "андерс",
          «б»: «бенгт»,
          }
          upone_map (dict, "б")
          fmt.Println (dict) // map [a: anders b: BENGT]
          }
           

          Верх

          Конструкции

          🔗

          Питон
           из математического импорта sqrt
          
          
          класс Point (объект):
              def __init __ (self, x, y):
                  self.x = x
                  self.y = y
          
          
          расстояние def (точка1, точка2):
              вернуть sqrt (point1.x * point2.x + point1.y * point2.y)
          
          
          p1 = точка (1, 3)
          p2 = Точка (2, 4)
          print (distance (p1, p2)) # 3.74165738677
           
          Вперед
           основной пакет
          
          импорт (
          "fmt"
          "математика"
          )
          
          type Point struct {
          x float64
          y float64
          }
          
          func distance (point1 Point, point2 Point) float64 {
          вернуть math.Sqrt (point1.x * point2.x + point1.y * point2.y)
          }
          
          // Поскольку структуры копируются автоматически,
          // лучше передать как указатель.
          func distance_better (point1 * Point, point2 * Point) float64 {
          вернуть математику.Sqrt (point1.x * point2.x + point1.y * point2.y)
          }
          
          func main () {
          p1: = точка {1, 3}
          p2: = точка {2, 4}
          fmt.Println (distance (p1, p2)) // 3.7416573867739413
          fmt.Println (distance_better (& p1, & p2)) // 3.7416573867739413
          }
           

          Верх

          Методы

          🔗

          Питон
           из математического импорта sqrt
          
          
          класс Point (объект):
              def __init __ (self, x, y):
                  я.х = х
                  self.y = y
          
              расстояние def (себя, другое):
                  вернуть sqrt (self.x * other.x + self.y * other.y)
          
          
          p1 = точка (1, 3)
          p2 = Точка (2, 4)
          print (p1.distance (p2)) # 3.74165738677
          print (p2.distance (p1)) # 3.74165738677
           
          Вперед
           основной пакет
          
          импорт (
          "fmt"
          "математика"
          )
          
          type Point struct {
          x float64
          y float64
          }
          
          func (this Point) distance (other Point) float64 {
          вернуть math.Sqrt (this.x * other.x + this.y * other.y)
          }
          
          // Структуры Dince копируются автоматически,
          // лучше передать как указатель.
          func (this * Point) distance_better (other * Point) float64 {
          вернуть math.Sqrt (this.x * other.x + this.y * other.y)
          }
          
          func main () {
          p1: = точка {1, 3}
          p2: = точка {2, 4}
          fmt.Println (p1.distance (p2)) // 3.7416573867739413
          fmt.Println (p1.distance_better (& p2)) // 3.7416573867739413
          }
           

          Верх

          горутины

          🔗

          Обратите внимание, что когда вы запускаете их, числа появляются в другом порядке
          между прогонами.

          В примере Python он завершается автоматически, когда все запросы имеют
          законченный.

          Питон
           импорт urllib2
          импорт многопроцессорности
          
          
          def f (url):
              req = urllib2.urlopen (url)
              пытаться:
                  печать (len (req.read ()))
              Ну наконец то:
                  req.close ()
          
          
          urls = ("https://www.peterbe.com", "https://python.org", "https://golang.org")
          
          
          если __name__ == "__main__":
              p = multiprocessing.Pool (3).
              p.map (f, urls)
           
          Вперед
           основной пакет
          
          импорт (
          "fmt"
          "io / ioutil"
          "net / http"
          "синхронизировать"
          )
          
          func f (url string) {
          ответ, ошибка: = http.Получить (URL)
          if err! = nil {
          паника (ошибка)
          }
          отложить response.Body.Close ()
          body, err: = ioutil.ReadAll (response.Body)
          if err! = nil {
          паника (ошибка)
          }
          
          fmt.Println (len (тело))
          }
          
          // См. Пример в https://golang.org/pkg/sync/#WaitGroup
          func main () {
          var wg sync.WaitGroup
          urls: = [] строка {
          "https://www.peterbe.com",
          "https://python.org",
          "https://golang.org",
          }
          для _, url: = диапазон URL {
          wg.Add (1)
          go func (строка URL) {
          отложить wg.Done ()
          f (URL)
          } (URL)
          }
          // Ждем завершения горутин
          wg.Подождите()
          }
           

          Верх

          Markdownserver

          🔗

          Использование простого ab (с параллелизмом):

            $ ab -n 10000 -c 10 http: // localhost: XXXX / markdown? Body = THis +% 2Ais% 2A + a + string
            

          Где XXXX - номер порта в зависимости от того, какой сервер вы
          Бег.

          Результатов:

            Python (Flask) 2103,06 [# / сек] (среднее)
          Питон (Торнадо) 1834 г.48 [# / сек] (среднее)
          Узел (экспресс) 4406,17 [# / сек] (среднее)
          Вперед 19539,61 [# / сек] (среднее)
            

          Чтобы запустить версию Go, сначала установите $ GOPATH , затем:

            $ иди получить github.com/russross/blackfriday
          $ go, запустите main.go
          $ curl http: // localhost: 8080 / markdown? body = THis +% 2Ais% 2A + a + строка
            

          Для запуска версий Tornado:

            $ virtualenv venv
          $ источник venv / bin / активировать
          $ pip install tornado mistune markdown
          $ python tornado_.ру
          $ curl http: // localhost: 8888 / markdown? body = THis +% 2Ais% 2A + a + строка
            

          Для запуска версии Flask:

            $ virtualenv venv
          $ источник venv / bin / активировать
          $ pip install Flask mistune markdown
          $ python flask_.py
          $ curl http: // localhost: 5000 / markdown? body = THis +% 2Ais% 2A + a + строка
            

          Для запуска версии NodeJS:

            $ npm install # берется из package.json
          $ node node_.js
          $ curl http: // localhost: 3000 / markdown? body = THis +% 2Ais% 2A + a + строка
            
          Питон
           попробуйте:
              импортировать mistune как уценку
          кроме ImportError:
              import markdown # реализация py
          
          импортный торнадо.ioloop
          импорт tornado.web
          
          
          класс MarkdownHandler (tornado.web.RequestHandler):
              def get (self):
                  body = self.get_argument ("тело")
                  self.write (markdown.markdown (тело))
          
          
          application = tornado.web.Application ([(r "/ markdown", MarkdownHandler)])
          
          если __name__ == "__main__":
              application.listen (8888)
              tornado.ioloop.IOLoop.instance (). start ()
           
           импорт журнала
          
          пытаться:
              импортировать mistune как уценку
          кроме ImportError:
              import markdown # реализация py
          
          из фляги импорт фляги, запрос
          
          app = Flask (__ имя__)
          
          
          журнал = ведение журнала.getLogger ("werkzeug")
          log.setLevel (logging.ERROR)
          
          
          @ app.route ("/ уценка")
          def markdown_view ():
              вернуть markdown.markdown (request.args ["body"])
          
          
          если __name__ == "__main__":
              app.run ()
           
          Вперед
           основной пакет
          
          импорт (
          "net / http"
          "Операционные системы"
          
          "github.com/russross/blackfriday"
          )
          
          func main () {
          порт: = os.Getenv ("ПОРТ")
          если порт == "" {
          порт = "8080"
          }
          
          http.HandleFunc ("/ уценка", GenerateMarkdown)
          http.ListenAndServe (":" + порт, ноль)
          }
          
          func GenerateMarkdown (rw http.ResponseWriter, r * http.Request) {
          уценка: = blackfriday.MarkdownCommon (
          [] байт (r.FormValue ("тело")))
          rw.Write (уценка)
          }
           

          Верх

          ORM (объектно-реляционный сопоставитель)

          🔗

          Это сравнение между
          gorp и
          sqlalchemy.

          Используя pq и psycopg2 он создает группу объектов экземпляра ORM,
          затем редактирует их все один за другим, а затем удаляет их все.Этот пример
          предполагает, что PostgreSQL и таблица уже существует.

          Создает X количество «разговоров» со следующими типами столбцов:

          1. id серийное целое число
          2. тема varchar (200)
          3. при отметке времени
          4. теги массив текста
          5. длительность реальная

          Затем, наконец, он измеряет, сколько времени нужно, чтобы сделать все вставки, все
          обновления и все удаления.

          При запуске их для 10000 итераций на моем компьютере я получаю
          следующие выходы:

            $ python orm.ру
          вставка 3.09894585609
          изменить 30.3197979927
          удалить 18.6974749565
          ИТОГО 52.1162188053
          
          $ go, запустите orm.go
          вставить 2.542336905s
          редактировать 10.28062312s
          удалить 6.851942699s
          ИТОГО 19.674
          Питон
           # * - кодировка: utf-8 - *
          время импорта
          случайный импорт
          дата и время импорта
          
          из sqlalchemy import create_engine
          из sqlalchemy.orm import sessionmaker
          из sqlalchemy.ext.declarative import declarative_base
          из sqlalchemy import Column, Integer, String, Float, DateTime, Sequence
          из sqlalchemy.диалекты импорт Postgresql
          
          HOW_MANY = 1000
          
          # импорт журнала
          # logging.basicConfig ()
          # logger = logging.getLogger ('sqlalchemy.engine')
          # logger.setLevel (logging.INFO)
          
          База = декларативная_база ()
          
          
          класс Talk (База):
              __tablename__ = "переговоры"
          
              id = Столбец (Целое число, Последовательность ("talk_id_seq"), primary_key = True)
              topic = Столбец (Строка)
              when = Столбец (DateTime)
              теги = столбец (postgresql.ARRAY (строка))
              продолжительность = столбец (плавающее)
          
          
          def _random_topic ():
              вернуть random.choice (
                  (
                      "Обсуждения еще не добавлены",
                      «Я работаю над веткой django-mongokit, которую я»
                      "думал, ты хотел бы знать о.",
                      "Я хочу выучить гэльский.",
                      "У меня все хорошо, спасибо.",
                      "(Кау ун КЕУ-ра шин КАУ-ла корень эх ЧОО-ник меня ун-Ройер?)",
                      "Ча бех шин КЕУ-ра, шех син мо ЧЙЕ-лух у-вах ЕЕН-тчух!",
                      "СТУ ЛУХ-ОМ БРИСС-кахт-чун гу МАВР",
                      "Suas Leis a 'Ghàidhlig! Вверх с гэльским!",
                      "Tha mi ag iarraidh briosgaid!",
                  )
              )
          
          
          def _random_when ():
              дата и время возврата (
                  random.randint (2000, 2010),
                  случайный.рандинт (1, 12),
                  random.randint (1, 28),
                  0,
                  0,
                  0,
              )
          
          
          def _random_tags ():
              теги = [
                  "один",
                  "два",
                  "три",
                  "четыре",
                  "5",
                  "шесть",
                  "Семь",
                  "восемь",
                  "9",
                  "10",
              ]
              random.shuffle (теги)
              вернуть теги [: random.randint (0, 3)]
          
          
          def _random_duration ():
              возвратный раунд (random.random () * 10, 1)
          
          
          def run ():
              двигатель = create_engine (
                  "postgresql: // peterbe: test123 @ localhost / fastestdb", echo = False
              )
          
              Сессия = создатель сеанса (привязка = движок)
              session = Session ()
          
              сеанс.query (Обсуждение) .delete ()
          
              t0 = время. время ()
              # СОЗДАТЬ ВСЕ
              переговоры = []
              для i в диапазоне (HOW_MANY):
                  talk = Обсуждение (
                      topic = _random_topic (),
                      when = _random_when (),
                      duration = _random_duration (),
                      tags = _random_tags (),
                  )
                  session.add (разговор)
                  talk.append (разговор)
          
              session.commit ()
          
              t1 = time.time ()
              # ИЗМЕНИТЬ ВСЕ
          
              для разговора в переговорах:
                  talk.topic + = "дополнительный"
                  talk.duration + = 1.0
                  talk.when + = datetime.timedelta (дни = 1)
                  talk.tags.append ("дополнительно")
                  session.merge (разговор)
          
              session.commit ()
              t2 = время. время ()
          
              # УДАЛИТЬ КАЖДОГО
              для разговора в переговорах:
                  session.delete (разговор)
              session.commit ()
              t3 = time.time ()
          
              print ("вставить", t1 - t0)
              print ("редактировать", t2 - t1)
              print ("удалить", t3 - t2)
              print ("ИТОГО", t3 - t0)
          
          
          если __name__ == "__main__":
              пробег()
           
          Вперед
           основной пакет
          
          импорт (
          "база данных / sql"
          "ошибки"
          "fmt"
          "github.com / coopernurse / gorp "
          _ "github.com/lib/pq"
          "журнал"
          "математика / ранд"
          // "Операционные системы"
          "регулярное выражение"
          "струны"
          "время"
          )
          
          тип StringSlice [] строка
          
          // Реализует sql.Scanner для типа среза String
          // Сканеры принимают значение базы данных (в данном случае как байтовый срез)
          // и устанавливает значение типа. Здесь мы приводим к строке и
          // выполняем синтаксический анализ на основе регулярного выражения
          func (s * StringSlice) Ошибка сканирования (интерфейс src {}) {
          asBytes, ok: = src. ([] байт)
          if! ok {
          вернуть ошибку (errors.New («Источник сканирования не [] байт»))
          }
          
          asString: = строка (asBytes)
          проанализировано: = parseArray (asString)
          (* s) = StringSlice (проанализировано)
          
          вернуть ноль
          }
          
          func ToArray (str [] строка) строка {
          L: = len (str)
          out: = "{"
          для i, s: = range str {
          out + = "\" "+ s +" \ ""
          если i + 1  (% s |% s))", unquotedValue, quotedValue)
          
          // Значения массива разделяются запятой, ЕСЛИ имеется более одного значения:
          arrayExp = regexp.MustCompile (fmt.Sprintf ("((% s) (,)?)", arrayValue))
          
          valueIndex int
          )
          
          // Находим индекс именованного выражения 'value'
          func init () {
          для i, subexp: = range arrayExp.SubexpNames () {
          if subexp == "значение" {
          valueIndex = я
          сломать
          }
          }
          }
          
          // Разбираем выходную строку из типа массива."\\] | \\" | \\\\) * »))) (,)?)
          func parseArray (строка массива) [] строка {
          результаты: = make ([] строка, 0)
          совпадения: = arrayExp.FindAllStringSubmatch (array, -1)
          для _, match: = диапазон соответствует {
          s: = соответствие [valueIndex]
          // строка _может_ быть заключена в кавычки, поэтому обрезайте их:
          s = strings.Trim (s, "\" ")
          results = append (результаты, s)
          }
          вернуть результаты
          }
          
          const HOW_MANY = 1000
          
          func random_topic () string {
          themes: = [] строка {
          "Обсуждения еще не добавлены",
          "Я работаю над веткой django-mongokit, о которой, как мне казалось, вы хотели бы узнать.",
          "Я хочу выучить гэльский.",
          "У меня все хорошо, спасибо.",
          "(Кау ун КЕУ-ра шин КАУ-ла корень эх ЧОО-ник меня ун-Ройер?)",
          "Ча бех шин КЕУ-ра, шех син мо ЧЙЕ-лух у-вах ЕЕН-тчух!",
          "СТУ ЛУХ-ОМ БРИСС-кахт-чун гу МАВР",
          "Suas Leis a 'Ghàidhlig! Вверх с гэльским!",
          "Tha mi ag iarraidh briosgaid!",
          }
          
          вернуть темы [rand.Intn (len (themes))]
          }
          
          func random_when () time.Time {
          время возврата. Дата (
          2000 + ранд.Intn (10),
          время. ноябрь,
          rand.Intn (12),
          rand.Intn (28),
          0, 0, 0, время.УНИВЕРСАЛЬНОЕ ГЛОБАЛЬНОЕ ВРЕМЯ)
          }
          
          func random_tags () [] строка {
          tags: = [] строка {
          "один",
          "два",
          "три",
          "четыре",
          "5",
          "шесть",
          "Семь",
          "восемь",
          "9",
          "10",
          }
          теги возврата [: rand.Intn (4)]
          }
          
          func random_duration () float64 {
          вернуть rand.Float64 () * 10
          }
          
          func main () {
          dbmap: = initDb ()
          отложить dbmap.Db.Close ()
          
          // изменить последовательность talk_id_seq перезапустить с 1;
          
          ошибка: = dbmap.TruncateTables ()
          checkErr (err, "Ошибка TruncateTables")
          
          // dbmap.TraceOn ("[gorp]", log.New (os.Stdout, "myapp:", log.Lmicroseconds))
          
          t0: = время.Сейчас()
          var говорит [HOW_MANY] Talk
          
          trans, err: = dbmap.Begin ()
          if err! = nil {
          паника (ошибка)
          }
          // СОЗДАЙТЕ
          для i: = 0; я 

          Верх

          аргументов

          🔗

          Для запуска:

            go ​​run args.go питер андерс бенгт
            

          И он должен вывести:

            ПЕТР
          АНДЕРС
          БЕНГТ
            
          Питон
           импортная система
          
          
          def преобразование (* args):
              для аргументов в аргументах:
                  печать (arg.upper ())
          
          
          если __name__ == "__main__":
              преобразовать (* sys.argv [1:])
           
          Вперед
           основной пакет
          
          импорт (
          "fmt"
          "Операционные системы"
          "струны"
          )
          
          func transform (args [] строка) {
          for _, arg: = range args {
          fmt.Println (strings.ToUpper (аргумент))
          }
          
          }
          func main () {
          args: = os.Args [1:]
          преобразовать (аргументы)
          }
           

          Верх

          Импорт псевдонима

          🔗

          Этот пример немного глуп, потому что обычно вы не беспокоитесь о
          псевдоним для коротких встроенных модулей.Подходит для длительного импорта
          имена как:

           импорт (
              pb "github.com/golang/groupcache/groupcachepb"
          )
           

          Вы также можете импортировать пакеты, которые фактически не будете использовать. Например.

           импорт (
              _ "image / png" // импорт может творить чудеса
          )
           
          Питон
           импортировать строку как s
          
          print (s.upper ("мир"))
           
          Вперед
           основной пакет
          
          импорт (
          "fmt"
          s "струны"
          )
          
          func main () {
          fmt.Println (s.ToUpper ("мир"))
          }
           

          Верх

          Sprintf

          🔗

          Вы могли видеть такие вещи, как fmt.Println ("какая-то строка") и
          вариации вокруг него. Но иногда вам может потребоваться просто сгенерировать
          строка с использованием инструментов форматирования, найденных в fmt без нее
          обязательно выходит на stdout . Это то что
          fmt.Sprintf предназначен для.

          Питон
           макс. = 10
          поднять исключение (f "Макс.число {max} ")
           
          Вперед
           основной пакет
          
          импорт "fmt"
          
          func main () {
          макс: = 10
          panic (fmt.Sprintf ("Максимальное количество% d", max))
          }
           

          Верх

          Uniqify

          🔗

          Версия Python хороша тем, что полностью не зависит от типа, пока
          значение поддерживает хеширование.
          Я уверен, что можно сделать аналогичный в Go, используя интерфейс {} .Патчи приветствуются.

          Для более быстрых вариантов в Python см.
          Самый быстрый способ унифицировать список в
          Python.

          Дополнительные мысли по этому поводу и пример реализации
          это не на месте проверьте этот список рассылки
          нить.

          Питон
           def uniqify (seq):
              замечено = {}
              unique = []
              для элемента в seq:
                  если товар не виден:
                      видел [item] = 1
                      unique.append (элемент)
              вернуть уникальный
          
          
          items = ["B", "B", "E", "Q", "Q", "Q"]
          print (uniqify (items)) # выводит ['B', 'E', 'Q']
           
          Вперед
           основной пакет
          
          импорт "fmt"
          
          func uniqify (items [] строка) [] строка {
          uniq: = make ([] строка, 0)
          замечено: = make (map [string] bool)
          
          // Для максимальной эффективности памяти выполните:
          // видел: = make (map [строка] struct {})
          // см .: https: // stackoverflow.ru / questions / 37320287 / maptstruct-and-maptbool-in-golang
          
          for _, i: = range items {
          если _, существует: = видел [я]; !существует {
          uniq = добавить (uniq, i)
          видел [я] = правда
          }
          }
          
          вернуть uniq
          }
          
          func main () {
          items: = [] строка {"B", "B", "E", "Q", "Q", "Q"}
          items = uniqify (предметы)
          fmt.Println (items) // печатает [B E Q]
          }
           

          Верх

          Dotdict

          🔗

          В версии Python вы также можете быть более явным и использовать
          что-то вроде:

           инициалов.setdefault (начальный, 0)
           

          вместо первой проверки наличия ключа.

          Обратите внимание, что в Go, когда вы устанавливаете тип int , он автоматически
          устанавливает значение 0 при инициализации.

          Питон
           инициалов = {}
          для имени в ("питер", "андерс", "бенгт", "бенгтссон"):
              initial = имя [0]
              # если инициалы не в инициалах:
              # инициалы [инициалы] = 0
              initials.setdefault (начальный, 0)
              инициалы [инициалы] + = 1
          
          печать (инициалы)
          # выходов
          # {'a': 1, 'p': 1, 'b': 2}
           
          Вперед
           основной пакет
          
          импорт "fmt"
          
          func main () {
          names: = [] строка {"питер", "андерс", "бенгт", "бенгтссон"}
          инициалы: = make (map [строка] int)
          for _, name: = диапазон имен {
          начальная: = строка (имя [0])
          инициалы [начальные] ++
          }
          fmt.Println (инициалы)
          // выводит
          // карта [p: 1 a: 1 b: 2]
          }
           

          .

          Голанг против Python | Golang vs Python Performance

          Перед началом любого проекта большинство команд разработчиков проводят несколько встреч, чтобы выбрать лучший язык для своего программного обеспечения. Часто это обсуждение сводится к Python и Golang. В этом блоге Golang vs Python я буду сравнивать два языка в лоб по различным параметрам, которые помогут вам как разработчику решить, какой язык лучше всего подходит для вас. Параметры сравнения:

          А теперь приступим.Прежде чем мы перейдем к сравнению Golang и Python, позвольте мне кратко познакомить вас с обоими этими языками.

          Go против Python | Какой язык вам следует учить?

          Что такое Голанг?

          Голанг, также известный как го, - это язык компьютерного программирования, разработанный Google. Его разработка началась в 2007 году в Google, а широкой публике он был представлен в 2009 году. Тремя ведущими разработчиками Go в Google были Роберт Гриземер, Роб Пайк и Кен Томпсон .Они поставили перед собой цель создать язык, в значительной степени основанный на синтаксисе языка программирования C, который устранил бы «посторонний мусор» таких языков, как C ++. В результате Go внедряет многие функции других современных языков, такие как перегрузка методов и операторов, арифметика указателей и наследование типов. В итоге продукт стал языком со статической типизацией, усовершенствованной и мощной библиотекой, непревзойденной производительностью и скоростью!

          Этого хватило на Go! Теперь поговорим немного о Python.

          Что такое Python?

          Итак, Python - это язык программирования общего назначения, и это просто еще один способ сказать, что его можно использовать почти для чего угодно. Он был создан голландским программистом Гвидо ван Россумом и впервые выпущен в 1991 году. Самым важным аспектом python является то, что это интерпретируемый язык, а это означает, что написанный код фактически не переводится в компьютерно-читаемый формат во время выполнения; большинство языков программирования выполняют это преобразование при компиляции программы.Этот тип языка также называют «языком сценариев», поскольку изначально он предназначался для использования в простых проектах.

          Итак, теперь, когда я дал вам приблизительное представление об этих двух языках, давайте приступим к их сравнению.

          Голанг против Python: производительность

          Во-первых, мы собираемся сравнить производительность языков, и что может быть лучше, чем просто решать сложные математические функции. Хотя это не совсем справедливо, это, безусловно, приводит к выводу, когда речь идет об использовании памяти и времени, затраченном на решение проблемы.

          Мы решили три разные задачи, используя оба языка, а именно: уравнение Мандельброта , задачу n тела и fasta . Это действительно сложные задачи, для выполнения которых требуется много вычислений, и они служат прекрасным способом проверить производительность и управление памятью рассматриваемого языка. Кроме того, это действительно интересные задачи, и их стоит прочитать, а пока давайте посмотрим, как обстоят дела с Golang и Python.

          Это ясно показывает нам, что Golang превосходит Python, когда дело касается производительности.

          Хорошо, продолжим, давайте сравним их по теме масштабируемости.

          Golang vs Python: масштабируемость

          Сегодня создание действительно масштабируемого приложения - это произведение искусства. Если что-то не масштабируется, это просто пагубно сказывается на бизнесе. Голанг был разработан как язык с учетом именно этого. Вся цель Golang заключалась в том, чтобы помочь разработчикам в Google решать проблемы масштаба «Google», в которых в основном участвуют тысячи программистов, работающих над большим серверным программным обеспечением, размещенным в тысячах кластеров.Вот почему Golang имеет встроенную поддержку параллельного управления процессами, то есть параллелизма. Python, с другой стороны, действительно испытывает трудности с параллелизмом, но может реализовать параллелизм через потоки.

          Давайте поймем разницу между параллелизмом и параллелизмом.

          Параллелизм и параллелизм

          Параллелизм означает, что приложение выполняет несколько задач одновременно (одновременно). Что ж, если у компьютера только один ЦП, приложение может не выполнять более одной задачи в одно и то же время, но внутри приложения одновременно обрабатывается более одной задачи.Он не завершает одну задачу полностью до того, как приступит к следующей.

          Параллелизм означает, что приложение разбивает свои задачи на более мелкие подзадачи, которые могут обрабатываться параллельно, например, на нескольких процессорах в одно и то же время.

          Итак, очевидно, что язык, который изначально поддерживает параллелизм, является идеальным языком для больших масштабируемых программ.

          Давайте теперь сравним эти два языка на основе их применения.

          Golang vs Python: Applications

          В этом разделе не будет явного победителя, потому что каждый язык программирования имеет определенную цель, например, javascript в основном используется для веб-разработки. Точно так же python широко используется в области анализа данных, искусственного интеллекта, глубокого обучения и веб-разработки. В основном это связано с безумными библиотеками, доступными в python, которые значительно упрощают жизнь в указанных областях.

          x

          Golang, с другой стороны, в основном используется для системного программирования. Благодаря поддержке параллелизма, он также нашел широкое применение и признание в области облачных или кластерных вычислений. Golang также получил признание и пользуется большим спросом в веб-разработке из-за его мощных и простых в использовании библиотек, которые позволяют настроить веб-сервер за считанные секунды. Вам, ребята, обязательно стоит посмотреть мой учебник по Golang , если вы все хотите научиться таким крутым вещам в Go.

          Голанг против Python: выполнение

          Теперь давайте сравним, как выполняется код Go и код Python. Итак, во-первых, Python - это язык с динамической типизацией, а Golang - язык со статической типизацией. Python и Go используют интерпретатор и компилятор соответственно.

          Теперь, чтобы понять, почему я сравнил язык по этому параметру, мы должны понять, в чем разница между языком со статической типизацией и языком с динамической типизацией.

          Статически типизированный язык - это язык, в котором типы переменных объявляются явно для компилятора, поэтому даже тривиальные ошибки выявляются очень легко, в то время как в динамически типизированном языке вывод типа реализуется интерпретатором, поэтому некоторые ошибки могут остаться, из-за того, что интерпретатор что-то интерпретирует неправильно!

          В основном то, что я хочу сказать, связано с тем, что python является языком с динамической типизацией, он как бы ограничивает программиста, когда он намеревается создать действительно большую программу, в то время как Go может обрабатывать оба типа программ с ловкостью.

          А теперь перейдем к библиотекам.

          Голанг против Python: библиотеки

          Библиотеки - это дар богов разработчикам, потому что они облегчают нашу жизнь. Итак, наличие отличной библиотеки для языка программирования имеет решающее значение. В этом случае Python определенно выигрывает из-за огромного количества доступных библиотек. Существуют такие пакеты, как Numpy, которые помогут вам с обработкой массивов и сложными матричными функциями, Tensorflow и Scikit Learn для глубокого обучения, OpenCV для обработки изображений, Pandas для анализа данных, matplotlib для визуализации, и список можно продолжать и продолжать.На самом деле, если питон известен чем-то одним, то это должна быть его безумная библиотека. Но это не значит, что Go не справляется. Когда Go разрабатывался, Google выбрал наиболее важные библиотеки как часть своих встроенных библиотек go. Хотя число может быть не таким уж большим, как у python, охватываемые области использования почти такие же. У них есть безумные библиотеки для веб-разработки, обработки баз данных, параллельного программирования и шифрования.

          Теперь перейдем к последнему пункту сравнения - удобочитаемости!

          Golang vs Python: читаемость

          Когда вы разрабатываете программное обеспечение для клиента, вы обычно будете работать в команде с десятью или даже сотнями других разработчиков.В такие моменты читаемость кода становится основным фактором, который необходимо учитывать.

          Многие из вас могут подумать, что питон, безусловно, берет верх, но у меня другое мнение, так что выслушайте меня. На первый взгляд, Python имеет фантастическую читаемость, но, на мой взгляд, они иногда перестараются. В python, вероятно, есть 10 разных способов сказать одно и то же, что обычно приводит к путанице, когда код большой или люди, работающие над кодом, находятся в большом количестве.

          С другой стороны, в Go есть строгие правила программирования. Он не позволяет импортировать ненужные библиотеки или создавать ненужные переменные. Это означает, что существует определенный способ выполнения задачи, который приводит к лучшему пониманию кода среди больших групп. Некоторые из вас могут сказать, что универсальность кода сильно страдает, но кого действительно волнует универсальность, особенно когда речь идет о базовом программировании? Синтаксис Golang также значительно менее дружелюбен для новичков, но он не такой беспощадный, как что-то вроде c или c ++.Поэтому для удобства чтения я выберу Golang.

          Итак, как вы видите, Golang определенно превосходит в большинстве случаев и, на мой взгляд, превосходит python в качестве языка программирования. Конечно, он может не иметь той славы, которую питон получил за все эти годы и расширение Интернета, но Go наверняка догоняет и в этом аспекте. Не согласен со мной? Скажите, почему, в разделе комментариев ниже. На этом сравнение пока закончено! Надеюсь, я помог вам определиться с выбором языка для вашего проекта.Следите за обновлениями блогов, связанных с Голангом!

          .

          Golang против Python: какой выбрать?

          Перед началом любого проекта большинство команд разработчиков проводят несколько встреч, чтобы выбрать лучший язык для своего программного обеспечения. Часто это обсуждение сводится к Python и Golang. В этом блоге Golang vs. Python я буду сравнивать два языка в лоб по различным параметрам, которые помогут вам как разработчику решить, какой язык лучше всего подходит для вас. Параметры сравнения:

          • Производительность
          • Масштабируемость
          • Приложения
          • Исполнение
          • Библиотеки
          • Читаемость кода

          Теперь приступим.Прежде чем мы перейдем к сравнению Golang и Python, позвольте мне дать вам краткое введение в оба этих языка.

          Что такое Голанг?

          Golang, также известный как Go, - это язык программирования, разработанный Google. Его разработка началась в 2007 году в Google, и он был представлен публике в 2009 году. Тремя ведущими разработчиками Go в Google были Роберт Гриземер, Роб Пайк и Кен Томпсон. Они поставили перед собой цель создать язык, в значительной степени основанный на синтаксисе языка программирования C, который устранил бы «посторонний мусор» таких языков, как C ++.В результате Go внедряет многие функции других современных языков, такие как перегрузка методов и операторов, арифметика указателей и наследование типов. В итоге продукт стал языком со статической типизацией, усовершенствованной и мощной библиотекой, непревзойденной производительностью и скоростью!

          Этого хватило о Go! Давайте теперь немного поговорим о Python.

          Что такое Python?

          Итак, Python - это язык программирования общего назначения, и это просто еще один способ сказать, что его можно использовать почти для чего угодно.Он был создан голландским программистом Гвидо ван Россумом и впервые выпущен в 1991 году. Наиболее важным аспектом Python является то, что это интерпретируемый язык, что означает, что написанный код фактически не переводится в компьютерно-читаемый формат во время выполнения; большинство языков программирования выполняют это преобразование при компиляции программы. Этот тип языка также называют «языком сценариев», поскольку изначально он предназначался для использования в тривиальных проектах.

          Хорошо, теперь, когда я дал вам приблизительное представление об этих двух языках, давайте приступим к их сравнению.

          Golang против Python: производительность

          Во-первых, мы собираемся сравнить производительность языков, и что может быть лучше, чем просто решать сложные математические функции. Хотя это не совсем справедливо, это, безусловно, приводит к выводу, когда речь идет об использовании памяти и времени, затраченном на решение проблемы.

          Мы решили три разные задачи, используя оба языка, а именно: уравнение Мандельброта , задачу n тела и fasta .Это действительно сложные задачи, для выполнения которых требуется много вычислений, и они служат прекрасным способом проверить производительность и управление памятью рассматриваемого языка. Кроме того, это действительно интересные задачи, и их стоит прочитать, а пока давайте посмотрим, как обстоят дела с Golang и Python.

          Это ясно показывает нам, что Golang превосходит Python, когда дело касается производительности.

          Хорошо, продолжаем, давайте сравним их по теме масштабируемости.

          Голанг vs.Python: масштабируемость

          Сегодня создание действительно масштабируемого приложения - это произведение искусства. Если что-то не масштабируется, это просто пагубно сказывается на бизнесе. Голанг был разработан как язык с учетом именно этого. Вся цель Golang заключалась в том, чтобы помочь разработчикам в Google решать проблемы масштаба Google, которые в основном включают тысячи программистов, работающих над большим серверным программным обеспечением, размещенным в тысячах кластеров. Вот почему Golang имеет встроенную поддержку параллельного управления процессами, т.е.е. параллелизм. Python, с другой стороны, действительно испытывает трудности с параллелизмом, но может реализовать параллелизм через потоки.

          Давайте поймем разницу между параллелизмом и параллелизмом.

          Параллелизм и параллелизм

          Параллелизм означает, что приложение выполняет более одной задачи одновременно (одновременно). Что ж, если у компьютера только один ЦП, приложение может не выполнять более одной задачи в одно и то же время, но внутри приложения одновременно обрабатывается более одной задачи.Он не завершает одну задачу полностью до того, как приступит к следующей.

          Параллелизм означает, что приложение разделяет свои задачи на более мелкие подзадачи, которые могут обрабатываться параллельно, например, на нескольких процессорах в одно и то же время.

          Итак, очевидно, что язык, который изначально поддерживает параллелизм, является идеальным языком для больших масштабируемых программ.

          Давайте теперь сравним эти два языка на основе их применения.

          Голанг против Python: приложения

          В этом разделе не будет явного победителя, потому что каждый язык программирования имеет определенную цель. Например, Javascript в основном используется для веб-разработки. Точно так же Python широко используется в области анализа данных, искусственного интеллекта, глубокого обучения и веб-разработки. В основном это связано с безумными библиотеками, доступными в Python, которые значительно упрощают жизнь в указанных областях.

          С другой стороны,

          Golang в основном используется для системного программирования. Благодаря поддержке параллелизма, он также нашел широкое применение и признание в области облачных или кластерных вычислений. Golang также получил признание и пользуется большим спросом в веб-разработке из-за его мощных и простых в использовании библиотек, которые позволяют настроить веб-сервер за считанные секунды. Вам, ребята, обязательно стоит посмотреть мой учебник по Golang, если вы все хотите изучить такие классные вещи в Go.

          Голанг против Python: выполнение

          Теперь сравним, как выполняется код Go и код Python. Итак, во-первых, Python - это язык с динамической типизацией, а Golang - язык со статической типизацией. Python и Go используют интерпретатор и компилятор соответственно.

          Теперь, чтобы понять, почему я сравнил язык по этому параметру, мы должны понять, в чем разница между языком со статической типизацией и языком с динамической типизацией.

          Статически типизированный язык - это язык, в котором типы переменных явно объявляются для компилятора, поэтому даже тривиальные ошибки выявляются очень легко, в то время как в динамически типизированном языке вывод типа реализуется интерпретатором, поэтому некоторые ошибки могут остаться из-за того, что интерпретатор интерпретирует что-то неправильно !

          По сути, то, что я хочу сказать, связано с тем, что Python - это язык с динамической типизацией, он как бы ограничивает программиста, когда он намеревается создать действительно большую программу, в то время как Go может обрабатывать оба типа программ с ловкостью.

          А теперь перейдем к библиотекам.

          Голанг против Python: библиотеки

          Библиотеки - это подарок разработчикам, потому что они делают нашу жизнь проще. Итак, наличие отличной библиотеки для языка программирования имеет решающее значение. В этом случае Python определенно выигрывает из-за огромного количества доступных библиотек. Существуют такие пакеты, как Numpy, которые помогут вам с обработкой массивов и сложными матричными функциями, Tensorflow и Scikit Learn для глубокого обучения, OpenCV для обработки изображений, Pandas для анализа данных, matplotlib для визуализации, и этот список можно продолжать и продолжать.На самом деле, если Python известен чем-то одним, то это его безумная библиотека. Но это не значит, что Go терпит неудачу. Когда Go разрабатывался, Google выбрал наиболее важные библиотеки как часть своих встроенных библиотек Go. Хотя число может быть не таким уж большим, как у Python, охватываемые поля использования почти такие же. У них есть безумные библиотеки для веб-разработки, обработки баз данных, параллельного программирования и шифрования.

          Теперь перейдем к последнему пункту сравнения - удобочитаемости!

          Голанг vs.Python: читаемость

          Когда вы разрабатываете программное обеспечение для клиента, вы обычно будете работать в команде с десятью или даже сотнями других разработчиков. В такие моменты читаемость кода становится основным фактором, который необходимо учитывать.

          Многие из вас, возможно, думают, что Python, безусловно, берет верх, но у меня другое мнение, так что выслушайте меня. На первый взгляд, Python имеет фантастическую читаемость, но, на мой взгляд, они иногда перестараются.В Python, вероятно, есть 10 различных способов сказать одно и то же, что обычно приводит к путанице, когда код большой или людей, работающих над кодом, много.

          С другой стороны, в Go есть строгие правила программирования. Он не позволяет импортировать ненужные библиотеки или создавать ненужные переменные. Это означает, что существует определенный способ выполнения задачи, который приводит к лучшему пониманию кода среди больших групп. Некоторые из вас могут сказать, что универсальность кода сильно страдает, но кого действительно волнует универсальность, особенно когда речь идет о базовом программировании? Синтаксис Golang также значительно менее дружелюбен для новичков, но он не такой беспощадный, как что-то вроде C или C ++.Поэтому для удобства чтения я выберу Golang.

          Итак, как вы видите, Golang определенно имеет преимущество перед в большинстве случаев и, на мой взгляд, превосходит Python как язык программирования. Конечно, у него может не быть той славы, которую Python получил за все эти годы и расширение Интернета, но Go наверняка догоняет и в этом аспекте. Не согласен со мной? Скажите, почему, в разделе комментариев ниже. На этом сравнение пока закончено! Надеюсь, я помог вам решить, какой язык лучше для вашего проекта.Следите за обновлениями блогов, связанных с Голангом!

          .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *