Python代码在实际应用中还是比较简捷的。给计算机语言一族在计算机语言实际应用带来一些好处,下面就简单的说明一下在Python代码标号中所对应代码中的注释处的详细介绍。
1. 判断字符串的长度加上PyStringObject本身的大小(即整个变长对象PyStringObject的实际大小)后, 是否超过系统限制的最大大小. 书上的Python旧版代码中仅判断size > PY_SSIZE_T_MAX, 也就是没有考虑对象自身的大小, 是不完善的.
2. 当需要分配的内存超过系统限制的上限时, 抛出异常PyExc_OverflowError, 即溢出.书上的Python代码旧版代码没有抛出异常.
3. 对于长度为0的空串(即"", 而非NULL), 若nullstring已经被初始化, 则返回nullstring. 这是intern机制的一部分. 书上的Python旧版代码没有对nullstring增加引用计数.
4. 对于长度为1的字符串, 若字符表中该字符对象已经初始化, 则返回该字符对象. 这是intern机制的一部分. 书上的Python代码旧版代码没有对该字符对象增加引用计数.
5. 若申请内存空间失败, 则调用PyErr_NoMemory()处理. 书上的Python旧版代码中没这一部分.
6. 使用Py_MEMCPY代替直接使用memcpy. 贴一下Py_MEMCPY的代码:
- [Include/pyport.h]
- /* Py_MEMCPY can be used instead of memcpy in cases
where the copied blocks- * are often very short. While most platforms have
highly optimized code for- * large transfers, the setup costs for memcpy are
often quite high. MEMCPY- * solves this by doing short copies "in line".
- */
- #if defined(_MSC_VER)
- #define Py_MEMCPY(target, source, length) do { \
- size_t i_, n_ = (length); \
- char *t_ = (void*) (target); \
- const char *s_ = (void*) (source); \
- if (n_ >= 16) \
- memcpy(t_, s_, n_); \
- else \
- for (i_ = 0; i_ < n_; i_++) \
- t_[i_] = s_[i_]; \
- } while (0)
- #else
- #define Py_MEMCPY memcpy
- #endif
看注释应该就明白了, Py_MEMCPY是为跨平台优化而提供的一个宏. 因为在有些平台上, 调用mempcy的代价比较高, 所以对于小数据量的拷贝就原地展开成循环. 那Python代码觉得哪些平台需要这样的优化呢? 看到_MSC_VER了吧, 这个是M$的C编译器特有的宏, 看来, 需要特别优化的就是Windows下了.
【编辑推荐】