小编Jey*_*mon的帖子

替换整个字符串比仅替换第一个字符更快

a我尝试用b给定的大字符串替换字符。我做了一个实验 - 首先我在整个字符串中替换它,然后我只在它的开头替换它。

import re
# pattern = re.compile('a')
pattern = re.compile('^a')
string = 'x' * 100000

pattern.sub('b', string)
Run Code Online (Sandbox Code Playgroud)

我预计替换开头要比替换整个字符串快得多,因为您只需检查 1 个位置而不是 100000 个位置。我做了一些测量:

python -m timeit --setup "import re; p=re.compile('a'); string='x'*100000" "p.sub('b', string)"
10000 loops, best of 3: 19.1 usec per loop
Run Code Online (Sandbox Code Playgroud)
python -m timeit --setup "import re; p=re.compile('^a'); string='x'*100000" "p.sub('b', string)"
1000 loops, best of 3: 613 usec per loop
Run Code Online (Sandbox Code Playgroud)

结果表明,相反,尝试替换整个字符串大约快 30 倍。你会期待这样的结果吗?你能解释一下吗?

python regex time

11
推荐指数
1
解决办法
431
查看次数

Python 中的基本并发 SQLite 编写器

我创建了一个非常基本的脚本,定期将一些数据写入数据库:

测试.py

import sqlite3
import sys
import time

DB_CREATE_TABLE = 'CREATE TABLE IF NOT EXISTS items (item TEXT)'
DB_INSERT = 'INSERT INTO items VALUES (?)'
FILENAME = 'test.db'


def main():
    index = int()
    c = sqlite3.connect(FILENAME)
    c.execute(DB_CREATE_TABLE)
    c.commit()

    while True:
        item = '{name}_{index}'.format(name=sys.argv[1], index=index)
        c.execute(DB_INSERT, (item,))
        c.commit()
        time.sleep(1)
        index += 1

    c.close()


if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

现在我可以通过多次运行脚本来实现简单的并发:

python3 test.py foo &
python3 test.py bar &
Run Code Online (Sandbox Code Playgroud)

我尝试阅读一些有关脚本同时写入同一数据库文件的文章,但我仍然不确定我的脚本将如何处理此类事件,并且我不知道如何测试它。

我的期望是,在不太可能发生的情况下,当我的脚本的两个实例尝试在同一毫秒内写入数据库时​​,后一个实例将只是默默地等待,直到前一个实例完成其工作。

我当前的实施是否满足我的期望?如果没有,发生此类事件时它会如何表现以及如何修复?

python sqlite concurrency

6
推荐指数
1
解决办法
955
查看次数

推荐的名字词序?

从我的角度来看,可以(至少)有两种方法来为变量、函数、类等创建名称。

  1. 结构化的:

    history_clear()
    history_save_to_file()
    cache_remove_entry()
    cache_find()
    browser_window_url_trim()
    
    Run Code Online (Sandbox Code Playgroud)
  2. 人类可读:

    clear_history()
    save_history_to_file()
    remove_entry_from_cache()
    find_in_cache()
    check_for_updates()
    
    Run Code Online (Sandbox Code Playgroud)

首选词序是什么?有没有?我对编程很陌生,但我想从一开始就养成良好的编码习惯。我已经简要阅读了PEP 8风格指南,但我没有在那里找到答案。

python naming-conventions

5
推荐指数
1
解决办法
290
查看次数

C#类 - 基本示例

这基本上是我第一次尝试理解C#中的类.我在互联网上经历了几个教程,但是我最缺少的东西和我还没有找到的东西,是一个简单的好例子.

我知道我的基本程序应该是什么样子,我将非常感谢你的帮助:

using System;

namespace Introduction_to_classes
{
    class Person
    {
        int Age;
        string Name;

        int DateOfBirth()
        {
            return 2013 - Age;
        }
    }

    class Program
    {
        public static void Main()
        {
            Person Mother = new Person(35, Alice);
            Person Son = new Person(12, Johny);

            Mother.Name = "Lucy";  // Just changing the value afterwards

            if(Mother.Age > Son.Age)
            {
                int year = Mother.DateOfBirth();
                Console.WriteLine("Mom was born in {0}.", year);
            }

            Console.ReadLine();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这只是一个想法,它绝对不起作用.但最重要的是,如果你能够将其改正为工作实例,它将对我有所帮助......

c# class

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

CPU和内存通信

我是程序员初学者,但我想更深入地了解这些事情.我做了一些研究并阅读了很多文字,但我还没有理解一些东西......

编码基本内容时(在C中):

int myNumber;
myNumber = 3;
printf("Here's my number: %d", myNumber);
Run Code Online (Sandbox Code Playgroud)

我发现(主要在32位CPU上)整数取代32位= 4个字节.所以在我的代码的第一行CPU进入内存.存储器是字节可寻址的,因此CPU为我的变量选择4个连续字节,并将地址存储到第一个(或最后一个)字节.

在我的代码的第二行,CPU使用他存储的MyNumber变量地址,转到内存中的那个地址,找到32位的保留空间.他现在的任务是在那里存储数字"3",所以他用序列00000000-00000000-00000000-00000011填充这四个字节.在第三行它执行相同的操作 - CPU转到内存中的该地址并加载存储在该地址中的数字.

(第一个问题 - 我明白了吗?)

我不明白的是:
32位CPU中该地址(指向该变量的指针)的大小为4字节.(这就是为什么32位CPU可以使用最大4GB的内存 - 因为只有2 ^ 32个不同的二进制长度32的地址)
现在,CPU存储这些地址的地方?他有自己的内存或缓存存储吗?而为什么它存储了32位长的地址为32位长整型?简单地在其缓存中存储实际数字而不是指向大小相同时的指针是不是更好?

最后一个 - 如果它存储在自己的缓存中的某个地方,那些整数和长度的地址是相同的(4个字节),它将需要与实际变量存储地址完全相同的空间.但变量最多可占用4GB的空间,因此CPU必须有4GB的空间来存储这些变量的地址.这听起来很奇怪..

谢谢你的帮助!
我试图理解这一点,但它太难了......: - [

c memory cpu pointers

3
推荐指数
1
解决办法
1005
查看次数

为什么以相反顺序读取压缩的 TAR 文件会慢 100 倍?

首先,让我们生成一个压缩tar档案:

from io import BytesIO
from tarfile import TarInfo
import tarfile

with tarfile.open('foo.tgz', mode='w:gz') as archive:
    for file_name in range(1000):
        file_info = TarInfo(str(file_name))
        file_info.size = 100_000
        archive.addfile(file_info, fileobj=BytesIO(b'a' * 100_000))
Run Code Online (Sandbox Code Playgroud)

现在,如果我按自然顺序读取存档内容:

import tarfile

with tarfile.open('foo.tgz') as archive:
    for file_name in archive.getnames():
        archive.extractfile(file_name).read()
Run Code Online (Sandbox Code Playgroud)

并使用命令测量执行时间,我在 PC 上time得到的执行时间不到1 秒:

real    0m0.591s
user    0m0.560s
sys     0m0.011s
Run Code Online (Sandbox Code Playgroud)

但是如果我以相反的顺序读取存档内容:

real    0m0.591s
user    0m0.560s
sys     0m0.011s
Run Code Online (Sandbox Code Playgroud)

现在执行时间约为120 秒

real    2m3.050s
user    2m0.910s
sys     0m0.059s
Run Code Online (Sandbox Code Playgroud)

这是为什么?我的代码中有什么错误吗?或者是某些tar人的特点?它记录在某处吗?

python performance tar

3
推荐指数
1
解决办法
91
查看次数

变量类型提示在函数内部未验证

当你执行这段代码时:

from typing import Dict

bar: Dict[int, int, int] = dict()
Run Code Online (Sandbox Code Playgroud)

引发TypeError带有消息的异常。Too many parameters for typing.Dict; actual 3, expected 2但是当您在函数内定义变量时:

from typing import Dict

def foo():
    bar: Dict[int, int, int] = dict()

foo()
Run Code Online (Sandbox Code Playgroud)

这次没有例外。这是预期行为还是错误?

python type-hinting

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