programing

f-flash 대 str.format »

minimums 2023. 5. 28. 20:32
반응형

f-flash 대 str.format »

사용 중입니다..format()제 파이썬 3.5 프로젝트에는 많은 것이 있지만, 새로운 종류의 문자열 리터럴인 f-string 때문에 다음 파이썬 버전에서 더 이상 사용되지 않을 것 같습니다.

>>> name = "Test"
>>> f"My app name is {name}."
'My app name is Test.'

포맷된 문자열 기능이 기존의 문자열 기능을 완전히 대체합니까?.format()그리고 앞으로는 모든 경우에 새로운 스타일을 사용하는 것이 좋을까요?

'복잡한 것보다 단순한 것이 낫다'는 생각에 바탕을 둔 것으로 알고 있습니다.그러나 성능 문제는 어떻습니까? 두 문제 사이에 차이가 있습니까?아니면 단순히 같은 기능의 단순한 모양입니까?

다음 Python 버전에서는 더 이상 사용되지 않을 것 같습니다.

하지 마세요.str.format곧 떠날 것 같지 않습니다(이유도 없습니다), 소개한 PEP.fPrefixed-strings 추상화의 짝수 상태:

이 PEP는 기존 문자열 형식 메커니즘을 제거하거나 더 이상 사용하지 않도록 제안하지 않습니다.

포맷된 문자열은 문자열 포맷을 위한 다른 메서드의 단점을 해결하기 위해 도입되었습니다. 오래된 메서드를 버리고 파이썬 3.6+에서 코드가 작동하기를 원한다면 얼마나 많은 프로젝트가 f-string을 사용해야 하는지 알기 위해 도입되었습니다.


이것들의 성능에 관해서는, 그것들이 더 느릴 수도 있다는 나의 초기 의심은 잘못된 것 같고, f-string은 그들의 성능을 쉽게 능가하는 것 같습니다..format상대:

➜ cpython git:(master) ./python -m timeit -s "a = 'test'" "f'formatting a string {a}'"
500000 loops, best of 5: 628 nsec per loop
➜ cpython git:(master) ./python -m timeit "'formatting a string {a}'.format(a='test')"
100000 loops, best of 5: 2.03 usec per loop

이 문서 작성 시점에서 CPython 저장소의 마스터 분기에 대해 수행된 작업으로, 다음과 같이 변경될 수 있습니다.

  • f-strings새로운 기능으로서, 가능한 최적화가 있을 수 있습니다.
  • CPython에 대한 최적화로 인해 발생할 수 있음.format더 빠른 속도(예: Speedup 메서드 호출 1.2x)

하지만 속도에 대해 너무 걱정하지 말고, 여러분과 다른 사람들이 더 쉽게 읽을 수 있는 것에 대해 걱정해야 합니다.

많은 경우에, 그것은f-strings하지만 어떤 경우에는format더 낫습니다.

Jim의 답변을 바탕으로 성능 문제를 해결하기 위해 Python의dis두 개의 구문적으로 다르지만 기능적으로 동등한 기능에 대한 바이트 코드 명령을 비교하는 모듈입니다.

import dis

def f1():
    a = "test"
    return f"{a}"

def f2():
    return "{a}".format(a='test')

print(dis.dis(f1))
print(dis.dis(f2))

그 결과는 다음과 같습니다.

110 LOAD_CONST 1('테스트')2 STORE_FAST 0(a)
124 LOAD_FAST 0(a)6 형식_값 08 반품 _ 가치없음.150 LOAD_CONST 1('{a})2 LOAD_ATTR 0(형식)4 LOAD_CONST 2('시험')6 LOAD_CONST 3 (('a', )8 CALL_FUNCTION_KW 110 반품 _ 가치없음.

호출 오버헤드가 할 수 . f-string은 파일 형식 검사와 메모리 오버헤드를 유발합니다.에 의하면timeit따라서 성능이 약 3배 향상됩니다(특정 기능의 경우).

>> time it.time it('f1", 'from __main__import f1', number=100000)0.012325852433775708>> time it.timeit('f2", 'from __main__import f2', number=100000)0.036395029920726074

언급되지 않은 한 가지는, 오래된 기술에 대한 평가절하를 불가능하게 만드는, 보간은 문자열 리터럴만을 위한 것이라는 것입니다.즉, 문자열은 런타임에 한 번 렌더링되고 템플릿은 업데이트된 변수와 함께 다시 사용할 수 없습니다.예를 들어 다음과 같습니다.

>>> str_template = '{i} squared: {n}'
>>> for i in range(2, 5):
...     print(str_template.format(i=i, n=i**2))
... 
2 squared: 4
3 squared: 9
4 squared: 16

또 다른 경우는 i18n으로, 여기서 사용됩니다.더 오래된 기술 없이는 많은 사용 사례가 불가능할 것입니다.문자열 보간을 즐기지만 재사용 가능한 템플릿이 필요한 모든 사용 사례에서 사용할 수 있는 것은 아닙니다.

str.format()이 기존 프로젝트에 악몽이 될 것이기 때문에 더 이상 사용되지 않을 것 같습니다.그 말을 들으니...

string = f'This is a {object}'

보다 읽기 쉽습니다.

string = 'This is a {}'.format(object)

그래서 저는 당신이 가능할 때마다 f-string을 사용하라고 말합니다.

33.5를 사용하면 됩니다.fstring

pip install fstring

from fstring import fstring

x = 1

y = 2.0

plus_result = "3.0"

print fstring("{x}+{y}={plus_result}")

# Prints: 1+2.0=3.0

언급URL : https://stackoverflow.com/questions/43123408/f-strings-vs-str-format

반응형