Python代码在实际应用中的方案简介

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的代码:

 
  1. [Include/pyport.h]  
  2. /* Py_MEMCPY can be used instead of memcpy in cases 
    where the copied blocks  
  3. * are often very short. While most platforms have 
    highly optimized code for  
  4. * large transfers, the setup costs for memcpy are
     often quite high. MEMCPY  
  5. * solves this by doing short copies "in line".  
  6. */  
  7. #if defined(_MSC_VER)  
  8. #define Py_MEMCPY(target, source, length) do { \  
  9. size_t i_, n_ = (length); \  
  10. char *t_ = (void*) (target); \  
  11. const char *s_ = (void*) (source); \  
  12. if (n_ >= 16) \  
  13. memcpy(t_, s_, n_); \  
  14. else \  
  15. for (i_ = 0; i_ < n_; i_++) \  
  16. t_[i_] = s_[i_]; \  
  17. } while (0)  
  18. #else  
  19. #define Py_MEMCPY memcpy  
  20. #endif  

看注释应该就明白了, Py_MEMCPY是为跨平台优化而提供的一个宏. 因为在有些平台上, 调用mempcy的代价比较高, 所以对于小数据量的拷贝就原地展开成循环. 那Python代码觉得哪些平台需要这样的优化呢? 看到_MSC_VER了吧, 这个是M$的C编译器特有的宏, 看来, 需要特别优化的就是Windows下了.

您的回应...

相关话题

查看全部

也许你感兴趣

换一批

热门标签

更多