为什么要使用 curses.ascii.islower?
Why use curses.ascii.islower?
我最近偶然发现了 curses.ascii.islower()。它检查传递的字符是否为小写。
与 str.islower() 相比,使用此函数有什么好处?是的,它需要将 ASCII 字符转换为字符串对象,这会增加开销。但是除此之外还有什么优点吗?
我发现的一个缺点是需要额外的库,这些库可能可用也可能不可用。
时间似乎 str.islower
效率更高,所以它不仅仅是需要导入的开销:
Python2:
In [68]: timeit islower("f")
1000000 loops, best of 3: 641 ns per loop
In [69]: timeit "f".islower()
10000000 loops, best of 3: 50.5 ns per loop
python3
In [2]: timeit "f".islower()
10000000 loops, best of 3: 58.7 ns per loop
In [3]: timeit islower("f")
1000000 loops, best of 3: 801 ns per loop
一个 difference/advantage 是您实际上不必转换为 str 对象,您可以传递单字符串或整数。
In [38]: ascii.islower(97)
Out[38]: True
但是使用 chr 和 str.lower
仍然更有效:
In [51]: timeit ascii.islower(122)
1000000 loops, best of 3: 583 ns per loop
In [52]: timeit chr(122).islower()
10000000 loops, best of 3: 122 ns per loop
curses howto documentation 关于使用 curses.ascii
的唯一参考是它在使用 curses
库时的作用:
while 1:
c = stdscr.getch()
if c == ord('p'):
PrintDocument()
elif c == ord('q'):
break # Exit the while()
elif c == curses.KEY_HOME:
x = y = 0
curses.ascii 模块提供 ASCII class 成员函数,该函数采用整数或 1 个字符的字符串参数;这些可能有助于为您的命令解释器编写更具可读性的测试。它还提供采用整数或 1 个字符的字符串参数和 return 相同类型的转换函数。
我认为除了与 curses 模块相关的任何内容之外,您很难找到使用 ascii.islower
优于 str.islower
的任何优势。
运行 一些略有不同的测试,试图只检查函数速度(没有属性查找或名称空间差异)。
在 Python3.4 中测试(您自己可以轻松地 运行 这些)
python3 -m timeit -s "f = str.islower" \
"f('A')"
0.171 usec per loop
与:
相比
python3 -m timeit \
-s "import curses.ascii; f = curses.ascii.islower; del curses" \
"f('A')"
0.722 usec per loop
实际上你不会这样调用。
我最近偶然发现了 curses.ascii.islower()。它检查传递的字符是否为小写。 与 str.islower() 相比,使用此函数有什么好处?是的,它需要将 ASCII 字符转换为字符串对象,这会增加开销。但是除此之外还有什么优点吗?
我发现的一个缺点是需要额外的库,这些库可能可用也可能不可用。
时间似乎 str.islower
效率更高,所以它不仅仅是需要导入的开销:
Python2:
In [68]: timeit islower("f")
1000000 loops, best of 3: 641 ns per loop
In [69]: timeit "f".islower()
10000000 loops, best of 3: 50.5 ns per loop
python3
In [2]: timeit "f".islower()
10000000 loops, best of 3: 58.7 ns per loop
In [3]: timeit islower("f")
1000000 loops, best of 3: 801 ns per loop
一个 difference/advantage 是您实际上不必转换为 str 对象,您可以传递单字符串或整数。
In [38]: ascii.islower(97)
Out[38]: True
但是使用 chr 和 str.lower
仍然更有效:
In [51]: timeit ascii.islower(122)
1000000 loops, best of 3: 583 ns per loop
In [52]: timeit chr(122).islower()
10000000 loops, best of 3: 122 ns per loop
curses howto documentation 关于使用 curses.ascii
的唯一参考是它在使用 curses
库时的作用:
while 1:
c = stdscr.getch()
if c == ord('p'):
PrintDocument()
elif c == ord('q'):
break # Exit the while()
elif c == curses.KEY_HOME:
x = y = 0
curses.ascii 模块提供 ASCII class 成员函数,该函数采用整数或 1 个字符的字符串参数;这些可能有助于为您的命令解释器编写更具可读性的测试。它还提供采用整数或 1 个字符的字符串参数和 return 相同类型的转换函数。
我认为除了与 curses 模块相关的任何内容之外,您很难找到使用 ascii.islower
优于 str.islower
的任何优势。
运行 一些略有不同的测试,试图只检查函数速度(没有属性查找或名称空间差异)。
在 Python3.4 中测试(您自己可以轻松地 运行 这些)
python3 -m timeit -s "f = str.islower" \
"f('A')"
0.171 usec per loop
与:
相比python3 -m timeit \
-s "import curses.ascii; f = curses.ascii.islower; del curses" \
"f('A')"
0.722 usec per loop
实际上你不会这样调用。