小编Mar*_*som的帖子

在Python 3中将字符串转换为字节的最佳方法?

似乎有两种不同的方法将字符串转换为字节,如TypeError的答案所示:'str'不支持缓冲区接口

哪种方法更好或更好Pythonic?或者只是个人喜好?

b = bytes(mystring, 'utf-8')

b = mystring.encode('utf-8')
Run Code Online (Sandbox Code Playgroud)

python string character-encoding python-3.x

734
推荐指数
5
解决办法
110万
查看次数

如何在Python中获取PATH环境变量分隔符?

当需要连接多个目录时,如在可执行搜索路径中,存在与os相关的分隔符.对于Windows来说';',对于Linux来说就是这样':'.Python中是否有一种方法可以分割哪个字符?

在讨论这个问题时如何使用python找出我的python路径?,建议os.sep会这样做.答案是错误的,因为它是目录或文件名组件的分隔符,等同于'\\''/'.

python operating-system environment-variables

152
推荐指数
4
解决办法
8万
查看次数

删除指针后将指针NULL化是一种好习惯吗?

我首先要说的是,使用智能指针,你永远不必担心这一点.

以下代码有什么问题?

Foo * p = new Foo;
// (use p)
delete p;
p = NULL;
Run Code Online (Sandbox Code Playgroud)

这是由另一个问题的回答和评论引发的.Neil Butterworth的一条评论产生了一些赞成:

在删除后将指针设置为NULL不是C++中的通用优良做法.有时候它是一件好事,有时它是毫无意义的,可以隐藏错误.

有很多情况下它无济于事.但根据我的经验,它不会伤害.有人开导我.

c++ null pointers dynamic-allocation

139
推荐指数
6
解决办法
8万
查看次数

C++中临时的保证寿命?

C++是否为在函数调用中创建但未用作参数的临时变量的生命周期提供保证?这是一个示例类:

class StringBuffer
{
public:
    StringBuffer(std::string & str) : m_str(str)
    {
        m_buffer.push_back(0);
    }
    ~StringBuffer()
    {
        m_str = &m_buffer[0];
    }
    char * Size(int maxlength)
    {
        m_buffer.resize(maxlength + 1, 0);
        return &m_buffer[0];
    }
private:
    std::string & m_str;
    std::vector<char> m_buffer;
};
Run Code Online (Sandbox Code Playgroud)

以下是您将如何使用它:

// this is from a crusty old API that can't be changed
void GetString(char * str, int maxlength);

std::string mystring;
GetString(StringBuffer(mystring).Size(MAXLEN), MAXLEN);
Run Code Online (Sandbox Code Playgroud)

什么时候会调用临时StringBuffer对象的析构函数?是吗:

  • 在调用GetString之前?
  • GetString返回后?
  • 编译器依赖?

我知道C++保证本地临时变量只要有引用就有效 - 当引用成员变量时,它是否适用于父对象?

谢谢.

c++

95
推荐指数
2
解决办法
2万
查看次数

为什么从列表中创建列表会使其更大?

我在使用sys.getsizeof相同的列表时看到了一些不一致的地方.(Python 2.7.5)

>>> lst = [0,1,2,3,4,5,6,7,8,9]
>>> sys.getsizeof(lst)
76
>>> lst2 = list(lst)
>>> sys.getsizeof(lst2)
104
>>> lst3 = list(lst2)
>>> sys.getsizeof(lst3)
104
>>> sys.getsizeof(lst[:])
76
>>> sys.getsizeof(lst2[:])
76
Run Code Online (Sandbox Code Playgroud)

有人有简单的解释吗?

python list python-internals

50
推荐指数
2
解决办法
1570
查看次数

如何在Windows上安装python-dateutil?

我正在尝试将一些日期/时间转换为UTC,我认为这在Python中很简单 - 包括电池,对吗?好吧,除了Python(2.6)不包含任何tzinfo类之外,它很简单.没问题,快速搜索会出现python-dateutil,它应该完全符合我的需要.

问题是我需要在Windows上安装它.我能够使用7-zip升级.tar.gz2发行版,但现在我留下了一系列文件,没有关于如何继续的指导.当我尝试运行setup.py时,我收到错误"没有名为setuptools的模块".

python install python-dateutil

49
推荐指数
5
解决办法
13万
查看次数

delete是否适用于指向基类的指针?

您是否必须传递删除new返回的相同指针,或者您可以将指针传递给其中一个类基类型?例如:

class Base
{
public:
    virtual ~Base();
    ...
};

class IFoo
{
public:
    virtual ~IFoo() {}
    virtual void DoSomething() = 0;
};

class Bar : public Base, public IFoo
{
public:
    virtual ~Bar();
    void DoSomething();
    ...
};

Bar * pBar = new Bar;
IFoo * pFoo = pBar;
delete pFoo;
Run Code Online (Sandbox Code Playgroud)

当然,这大大简化了.我真正想要做的是创建一个充满boost :: shared_ptr的容器,并将其传递给一些代码,这些代码在完成后将从容器中删除它.这段代码对Bar或Base的实现一无所知,并且依赖于shared_ptr析构函数中隐含的delete运算符来做正确的事情.

这可能有用吗?我的直觉说不,因为指针不会有相同的地址.另一方面,dynamic_cast <Bar*>应该可以工作,所以编译器正在存储足够的信息来解决它.


感谢您的帮助,所有回答和评论的人.我已经知道虚拟析构函数的重要性,如我的例子所示; 在看到答案后我稍微考虑了一下,并意识到虚拟析构函数的全部原因就是这个确切的场景.因此它必须工作.由于没有将指针转换回原件的可见方法,我被抛出了.多一点思考让我相信有一种看不见的方法,我理论上析构函数正在返回真正的删除指针以释放.当我在~Base中看到这一行时,调查来自Microsoft VC++的编译代码证实了我的怀疑:

mov eax, DWORD PTR _this$[ebp]
Run Code Online (Sandbox Code Playgroud)

跟踪汇编程序显示这是传递给delete函数的指针.谜团已揭开.

我已经修复了将虚拟析构函数添加到IFoo的示例,这是一个简单的疏忽.再次感谢所有指出的人.

c++ polymorphism boost

44
推荐指数
1
解决办法
2万
查看次数

多核+超线程 - 线程是如何分布的?

我正在阅读新的英特尔凌动330的评论,他们注意到任务管理器显示4个核心 - 两个物理核心,另外两个由超线程模拟.

假设你有一个包含两个线程的程序.假设这些是在PC上进行任何工作的唯一线程,其他一切都是空闲的.操作系统将两个线程放在同一个核心上的概率是多少?这对程序吞吐量有很大影响.

如果答案不是0%,那么除了创建更多线程之外,是否还有其他缓解策略?

我希望Windows,Linux和Mac OS X会有不同的答案.


使用sk的答案作为Google饲料,然后按照链接,我在Windows中找到了GetLogicalProcessorInformation函数.它说的是"共享资源的逻辑处理器.这种资源共享的一个例子就是超线程场景." 这意味着jalf是正确的,但它不是一个明确的答案.

multithreading operating-system multicore hyperthreading

25
推荐指数
4
解决办法
1万
查看次数

为什么str(float)在Python 3中返回的数字比Python 2多?

在Python 2.7中,repra float返回最接近17位数的最接近的十进制数; 这足够精确,可以唯一地标识每个可能的IEEE浮点值.str一个float类似的工作,除了它将结果限制为12位数; 对于大多数用途,这是一个更合理的结果,并使您免受二进制和十进制表示之间的细微差别.

Python 2演示:http://ideone.com/OKJtxv

print str(1.4*1.5)
2.1
print repr(1.4*1.5)
2.0999999999999996
Run Code Online (Sandbox Code Playgroud)

在Python 3.2中它出现strrepr返回相同的东西.

Python 3演示:http://ideone.com/oAKRsb

print(str(1.4*1.5))
2.0999999999999996
print(repr(1.4*1.5))
2.0999999999999996
Run Code Online (Sandbox Code Playgroud)

是否存在描述变更的PEP或负责人的其他声明?

python python-2.7 python-3.x floating-point-conversion

23
推荐指数
1
解决办法
1604
查看次数

如何在循环中添加代码使其更快?

我有一个带内循环的简单函数 - 它缩放输入值,在查找表中查找输出值,并将其复制到目标.(ftol_ambient是我从网上复制的一种技巧,用于将float快速转换为int).

for (i = 0;  i < iCount;  ++i)
{
    iScaled = ftol_ambient(*pSource * PRECISION3);
    if (iScaled <= 0)
        *pDestination = 0;
    else if (iScaled >= PRECISION3)
        *pDestination = 255;
    else
    {
        iSRGB = FloatToSRGBTable3[iScaled];
        *pDestination = iSRGB;
    }
    pSource++;
    pDestination++;
}
Run Code Online (Sandbox Code Playgroud)

现在我的查找表是有限的,并且浮点数是无限的,因此有可能出现一个一个错误.我用一些代码创建了一个函数副本来处理这种情况.请注意,唯一的区别是添加了2行代码 - 请忽略丑陋的指针转换.

for (i = 0;  i < iCount;  ++i)
{
    iScaled = ftol_ambient(*pSource * PRECISION3);
    if (iScaled <= 0)
        *pDestination = 0;
    else if (iScaled >= PRECISION3)
        *pDestination = 255;
    else
    {
        iSRGB = …
Run Code Online (Sandbox Code Playgroud)

c++ optimization visual-c++-6 visual-c++

22
推荐指数
2
解决办法
1811
查看次数