为什么要使用 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


实际上你不会这样调用。