我正在尝试将一些代码从Python转换为C++,以便获得一点速度并提高我生锈的C++技能.昨天我感到震惊的是,在Python中,从stdin读取行的简单实现要比C++快得多(参见本文).今天,我终于想出了如何在C++中使用合并分隔符(与python的split()类似的语义)拆分字符串,现在我正在体验似曾相识!我的C++代码需要更长的时间才能完成工作(尽管不是一个数量级,就像昨天的课程一样).
Python代码:
#!/usr/bin/env python
from __future__ import print_function
import time
import sys
count = 0
start_time = time.time()
dummy = None
for line in sys.stdin:
dummy = line.split()
count += 1
delta_sec = int(time.time() - start_time)
print("Python: Saw {0} lines in {1} seconds. ".format(count, delta_sec), end='')
if delta_sec > 0:
lps = int(count/delta_sec)
print(" Crunch Speed: {0}".format(lps))
else:
print('')
Run Code Online (Sandbox Code Playgroud)
C++代码:
#include <iostream>
#include <string>
#include <sstream>
#include <time.h>
#include <vector>
using namespace std;
void split1(vector<string> &tokens, const string …Run Code Online (Sandbox Code Playgroud) 我试图在Python中创建一个简单的IRC客户端(作为一个项目,我学习语言).
我有一个循环,我用它来接收并解析什么IRC服务器发送了我,但如果我用raw_input输入的东西,它停止循环在它的轨道死,直到我输入的东西(明显).
如何在没有循环停止的情况下输入内容?
提前致谢.
(我不认为我需要发布代码,我只想输入一些没有while 1循环停止的东西.)
编辑:我在Windows上.
可能重复:
为sys.stdin设置较小的缓冲区大小?
我有一个Python(2.4/2.7)脚本fileinput用于从标准输入或文件中读取.它易于使用,除了一个案例外,效果很好:
tail -f log | filter.py
Run Code Online (Sandbox Code Playgroud)
问题是我的脚本缓冲了它的输入,而(至少在这种情况下)我希望立即看到它的输出.这似乎源于fileinput 在执行任何操作之前使用它readlines()来获取其bufsize值的字节这一事实.我尝试使用1的bufsize,它似乎没有帮助(这有点令人惊讶).
我确实发现我可以编写这样不缓冲的代码:
while 1:
line = sys.stdin.readline()
if not line: break
sys.stdout.write(line)
Run Code Online (Sandbox Code Playgroud)
这样做的问题是我丢失了fileinput功能(即它会自动打开传递给我程序的所有文件,如果没有则会自动打开stdin,它甚至可以自动解压缩输入文件).
那么我怎样才能充分利用两者呢?理想情况下,我不需要显式管理我的输入文件列表(包括解压缩),但在以"流"方式使用时不会延迟输入.
我在我的python脚本的顶部有规范的shebang.
#!/usr/bin/env python
Run Code Online (Sandbox Code Playgroud)
但是,我仍然经常想在运行脚本时将无缓冲的输出导出到日志文件中,所以我最终调用:
$ python -u myscript.py &> myscript.out &
Run Code Online (Sandbox Code Playgroud)
我可以像这样在shebang中嵌入-u选项吗?
#!/usr/bin/env python -u
Run Code Online (Sandbox Code Playgroud)
并且只打电话:
$ ./myscript.py &> myscript.out &
Run Code Online (Sandbox Code Playgroud)
......仍然没有缓解?我怀疑这不起作用,并希望在尝试之前检查.有什么东西可以实现这一目标吗?
我正在编写一个python脚本,可以通过管道从另一个命令中读取输入
batch_job | myparser
Run Code Online (Sandbox Code Playgroud)
我的脚本myparser处理输出batch_job并写入自己的标准输出.我的问题是我想立即看到输出(batch_job的输出是逐行处理的)但似乎有这个臭名昭着的stdin缓冲(据称是4KB,我还没有验证)延迟了一切.
我尝试了以下方法:
os.fdopen(sys.stdin.fileno(), 'r', 0)-u在我hashbang:#!/usr/bin/python -uexport PYTHONUNBUFFERED=1在调用脚本之前进行设置我的python版本是2.4.3 - 我没有可能升级或安装任何其他程序或包.我怎样才能摆脱这些延误?
可能的重复:
为 sys.stdin 设置较小的缓冲区大小?
我有一个超过 4096 字节的输入行进入 Python 的 stdin。代码简单地说:
line = sys.stdin.readline()
Run Code Online (Sandbox Code Playgroud)
这是在 4096 字节处截断行。有人知道解决办法吗?
我需要通过管道实时吸收bash命令的输出.例如
for i in $(seq 1 4); do echo $i; sleep 1; done | ./script.py
Run Code Online (Sandbox Code Playgroud)
script.py有这个
for line in sys.stdin.readlines():
print line
Run Code Online (Sandbox Code Playgroud)
我希望序列在可用时打印,但python脚本在继续之前等待bash脚本结束.
我看了这个相关的答案,但这并没有解决我的问题.我如何在python中实现这一目标?
我有一个由nginx和django提供服务的网站.
我的staging.py正确包含CACHE和中间件设置.您可以查看nginx.conf和与该站点相关的nginx conf文件.我已经确认memcached正在运行ngrep -d any port 11211.
我开启了整个网站的缓存,并希望通过这样做来看到性能 ab -n 1000 -c 10 http://site.com
关闭缓存后,我得到:
Concurrency Level: 10
Time taken for tests: 10.276 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 11695000 bytes
HTML transferred: 11559000 bytes
Requests per second: 97.32 [#/sec] (mean)
Time per request: 102.759 [ms] (mean)
Time per request: 10.276 [ms] (mean, across all concurrent requests)
Transfer rate: 1111.43 [Kbytes/sec] …Run Code Online (Sandbox Code Playgroud) 如何从stdin而不是从文件中读取图像数据?
使用C++接口,似乎有可能:https://stackoverflow.com/a/5458035/908515.该功能imdecode也可以在Python中使用.但它期待一个numpy array(第一)论点.我不知道如何转换stdin数据.
这是我试过的:
import cv
import sys
import numpy
stdin = sys.stdin.read()
im = cv.imdecode(numpy.asarray(stdin), 0)
Run Code Online (Sandbox Code Playgroud)
结果: TypeError: <unknown> data type = 18 is not supported
我有以下功能:
def getInput():
# define buffer (list of lines)
buffer = []
run = True
while run:
# loop through each line of user input, adding it to buffer
for line in sys.stdin.readlines():
if line == 'quit\n':
run = False
else:
buffer.append(line.replace('\n',''))
# return list of lines
return buffer
Run Code Online (Sandbox Code Playgroud)
在我的函数takeCommands()中调用,它被调用来实际运行我的程序.
但是,这没有任何作用.我希望将每一行添加到一个数组中,一旦一行=='退出',它就会停止用户输入.我都试过for line in sys.stdin.readlines()和for line sys.stdin,但他们都没有注册任何我输入的(我运行它在Windows命令提示符).有任何想法吗?谢谢
I'm trying to disable stdin buffering, in order to read the response of ANSI code \033[6n (which should report the cursor position).
我stdin_ub = os.fdopen(stdin.fileno(), 'rb', buffering=0)按照回答为 sys.stdin 设置较小的缓冲区大小中的建议进行了尝试?,但程序仍然在ch = stdin_ub.read(1)第一次尝试读取的行被阻塞。当在终端中输入 return 时它会解除阻塞,这表明 stdin 仍然是行缓冲的。
作为参考,这里是完整的代码:
def getpos():
stdin_ub = os.fdopen(sys.stdin.fileno(), 'rb', buffering=0)
sys.stdout.write('\033[6n')
sys.stdout.flush()
ch, k, field = None, -1, [b'', b'']
while True:
#print('reading wait...')
ch = stdin_ub.read(1)
#print('reading OK')
if ch == b'[': k = 0
elif ch == …Run Code Online (Sandbox Code Playgroud)