6

I've just recently stumbled upon curses.ascii.islower(). It checks if the passed character is lower case. What is the benefit in using this function as opposed to str.islower()? Yes, it requires a conversion of a ASCII character to string object, which adds overhead. But other than that are there any advantages?

One disadvantage I found is the need for extra library, which may or may not be available.

4

2 回答 2

2

对两者进行计时似乎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

蟒蛇3

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

一个区别/优势是您实际上不必强制转换为 str 对象,您可以传递一个字符串或一个整数。

In [38]: ascii.islower(97)
Out[38]: True

但是使用 chr withstr.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 文档中关于使用 的唯一参考是它在使用库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 类成员函数,它接受整数或 1 个字符的字符串参数;这些可能有助于为您的命令解释器编写更具可读性的测试。它还提供采用整数或 1 个字符的字符串参数并返回相同类型的转换函数。

我认为您将很难在与 curses 模块相关的任何内容之外找到任何ascii.islower优势。str.islower

于 2015-02-17T20:27:43.370 回答
0

运行一些略有不同的测试,尝试仅检查函数速度(没有属性查找或命名空间中的差异)。

在 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


在实践中,你不会这样打电话。

于 2015-02-17T21:21:00.433 回答