>  기사  >  백엔드 개발  >  Go로 마이그레이션하기 전에 Python 개발자가 알아야 할 사항

Go로 마이그레이션하기 전에 Python 개발자가 알아야 할 사항

高洛峰
高洛峰원래의
2016-10-20 09:33:081042검색

이 블로그는 Python/Cython 코드의 상당 부분을 Go 언어로 마이그레이션한 경험을 기록한 (긴) 블로그입니다. 전체 이야기, 배경 및 모든 것을 알고 싶다면 계속 읽으십시오. Python 개발자가 시작하기 전에 알아야 할 사항에만 관심이 있다면 아래 링크를 클릭하세요.

Python에서 Go로 마이그레이션하기 위한 팁과 요령

배경


Repustate 기술의 가장 큰 성과는 아랍어 정서 분석의 실현입니다. 아랍어는 정말 이해하기 어려운 단어입니다. 단어의 문법적 형태도 너무 복잡합니다. 아랍어의 토큰화(문장을 독립적인 단어로 나누는 것)는 영어보다 어렵습니다. 아랍어 단어 안에 공백이 포함될 수 있기 때문입니다(예: 알레프 위치 내). 이는 비밀로 할 필요가 없습니다. 즉, Repusate는 SVM(Support Vector Machine)을 사용하여 문장의 가장 가능성 있는 의미를 추출한 후 이를 기반으로 감정을 분석합니다. 우리는 총 22개의 모델(22개의 지원 벡터 머신)을 사용했으며 문서의 모든 단어를 분석했습니다. 즉, 문서에 500단어가 포함되어 있으면 지원 벡터 머신 비교 작업이 10,000회 이상 발생합니다.

Python


Repustate는 거의 완벽하게 Python으로 구현되었습니다. 왜냐하면 Django를 애플리케이션 프로그래밍 인터페이스와 웹 사이트 아키텍처로 사용하기 때문입니다. 따라서 코드의 통일성을 유지하고 아랍어 감정 엔진 전체를 Python으로 구현할 수 밖에 없습니다. 프로토타이핑과 구현 과정에서 Python은 여전히 ​​매우 좋습니다. 매우 강력한 표현 능력과 강력한 타사 라이브러리 리소스. 웹페이지만 제공하는 경우에도 여전히 완벽합니다. 그러나 낮은 수준의 계산을 수행해야 하고 해시 테이블(파이썬의 사전)에 대해 많은 비교 작업을 수행해야 하는 경우 속도가 느려집니다. 초당 2~3개의 아랍어 문서만 처리할 수 있는데 너무 느립니다. 초당 500개의 문서를 처리할 수 있는 영어 감정 엔진과 비교해 보세요.

병목 현상


그래서 어떤 부분이 느리게 실행되는지 연구하기 위해 Python 프로파일러를 시작했습니다. 각 단어에 대해 22개의 서포트 벡터 머신을 사용하겠다고 말한 것을 기억하시나요? 이러한 프로세스는 모두 직렬이며 병렬 작업이 없습니다. 좋아요, 우리의 첫 번째 아이디어는 이것을 맵/리듀스 같은 작업으로 바꾸는 것입니다. 간단히 말해서, map/reduce는 Python에 적합하지 않습니다. 동시성이 필요할 때 Python을 사용하기가 전혀 쉽지 않습니다. PyCon 2013에서 Guido는 이 문제를 해결하기 위한 자신의 새로운 프로젝트인 Tulip을 언급했지만 출시되기까지는 시간이 좀 걸렸습니다. 더 나은 옵션이 이미 있다면 왜 기다려야 합니까?

Go 언어를 바꾸거나 집에 가서 농장을 운영하세요


Mozilla에 있는 친구들이 Mazilla 서비스의 로깅 아키텍처 코드 대부분이 다음과 같다고 말했습니다. 부분적으로는 고루틴(Go 스레드)의 힘으로 인해 Go로 전환되었습니다. Go는 Google의 여러 사람들이 병렬성을 Python의 다른 솔루션과 같은 사후 고려 사항이 아닌 첫 번째 수준 개념으로 처리하도록 설계했습니다. 그래서 우리는 Python을 Go로 바꾸기 시작했습니다.

Go 코드는 아직 프로덕션 수준은 아니지만 결과는 이미 매우 고무적입니다. 우리는 초당 1000개의 문서를 처리했고, 더 적은 메모리를 사용했으며, Python과 함께 제공되는 성가신 다중 프로세스/gevent/"Ctrl+C가 내 프로세스를 종료한 이유" 코드를 처리할 필요가 없었습니다.

우리가 Go와 사랑에 빠진 이유


프로그래밍 언어가 어떻게 작동하는지 조금 아시는 분(해석과 컴파일의 차이점을 이해하고 동적 및 정적) 을 입력하고 "야, Go가 확실히 더 빠르구나."라고 말하세요. 예, Java로 모든 것을 다시 작성하여 비슷한 성능을 얻을 수도 있지만 이것이 Go가 승리하는 이유는 아닙니다. Go로 작성한 코드는 쉽게 정확합니다. 이유를 설명할 수는 없지만 일단 코드가 컴파일되면(컴파일 속도가 매우 빠름) 작동할 수 있다는 느낌을 받게 됩니다(실행할 때 오류가 발생하지 않을 뿐만 아니라 논리적으로도 정확하다는 점). 이상하게 들리겠지만 사실이에요. 이는 Python이 중복성 문제(또는 중복성 없음)를 해결하는 것과 유사하므로 함수형 프로그래밍을 쉽게 수행할 수 있습니다. Go 스레드와 채널을 사용하면 생활이 매우 쉬워집니다. 또한 표현력을 잃지 않으면서 정적 유형 지정과 메모리 할당의 보다 정밀한 제어를 통해 성능이 향상됩니다.

알았어야 했던 것들


칭찬에도 불구하고 Go를 사용하려면 Python을 사용하는 것과는 다른 사고방식이 필요합니다. Python을 Go로 변환할 때 무작위로 떠오른 사항은 다음과 같습니다.

내장된 컬렉션 유형이 없습니다(map을 사용한 후 존재 여부를 확인해야 함)

컬렉션 유형이 없기 때문에 교차, 합집합 등의 메소드를 직접 구현해야 합니다

튜플이 없으므로 자체 구조(struct)를 설계하거나 슬라이스(유사)를 사용해야 합니다. 배열로)

비슷하지 않음_ _getattr_() 메서드를 사용하려면 존재 여부를 확인해야 하지만 기본값을 설정해서는 안 됩니다. 예를 들어 Python에서는 다음과 같이 작성할 수 있습니다. value = dict.get("a_key", "default_value")

오류를 확인해야 함(또는 최소한 명시적으로 무시해야 함)

사용하지 않는 변수 및 패키지를 가질 수 없으며 때때로 일부 코드를 주석 처리해야 함

[]바이트와 문자열 사이를 전환하면 일반 처리(regexp)는 []바이트(쓰기 가능)를 사용합니다. 맞는말인데 아직도 앞뒤로 변환하는게 번거롭네요

파이썬 구문이 좀 더 여유로워졌습니다. 범위를 벗어난 인덱스를 사용하여 오류 없이 문자열 조각을 검색하거나 음수를 사용하여 조각을 검색할 수 있습니다. Go에서는 그렇지 않습니다.

혼합형 데이터 구조를 사용할 수 없습니다. 이것이 반드시 적절하지는 않을 수도 있지만, 때때로 Python에는 문자열과 목록이 혼합된 값을 갖는 사전이 있습니다. Go가 아닌 Go에서는 데이터 구조나 사용자 정의 구조를 정리해야 합니다. )

카멜 케이스 규칙(첫 글자가 대문자가 아닌 함수/구조는 다른 패키지에 노출되지 않습니다). 나는 Python의 소문자 및 밑줄 규칙을 선호합니다.

부울 유형처럼 사용할 수 있는 Python의 많은 유형(0, 빈 문자열, None은 부울 "false"로 사용할 수 있음)과 달리 오류가 비어 있는지 명시적으로 확인해야 합니다.

일부 모듈(예: crypo/md5)에는 문서가 충분하지 않지만 IRC의 go-nutes는 매우 강력하고 강력한 지원을 제공합니다

숫자에서 문자열(int64->string) 및 []바이트에서 문자열(As long) string([]byte))이 다르기 때문에 Go의 코드를 프로그래밍 언어처럼 읽으려면 strconv

를 호출해야 하지만 Python은 의사 코드처럼 작성할 수 있습니다. Go에서는 or 및 and 대신 || 및 &&를 사용하여 영어가 아닌 숫자 문자를 더 많이 사용합니다.

파일 쓰기에는 File.Write([]byte) 및 File.WriteString(string)이 있는데, 이는 문제 해결 방법 중 하나라는 Python 개발자의 신조와 일치하지 않습니다.

문자열 삽입은 사용하기 쉽지 않습니다. fmt.Sprintf를 자주 사용해야 합니다.

생성자가 없으며, 일반적인 습관은 NewType() 함수를 작성하여 원하는 구조를 반환하는 것입니다.

Else(또는 else if)의 형식이 올바르게 지정되어야 하며 else는 if와 일치하는 중괄호와 같은 줄에 있어야 합니다. 기묘.

함수 내부와 외부에서 서로 다른 대입 연산자를 사용하세요. 함수 변수만 사용할 수 있습니다 =)

키 목록(dict.keys()) 또는 값(dict.values()) 또는 튜플 목록(dict.items)만 원하는 경우 () ), Go에는 해당 기능이 없으며

만 반복할 수 있습니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:Python 예외 요약다음 기사:Python 예외 요약