еще один способ сделать это:
df['period'] = df['Year'].astype(str) + df['quarter']
или бит медленнее:
df['period'] = df[['Year','quarter']].astype(str).sum(axis=1)
Давайте проверим его на 200K строках DF:
In [250]: df
Out[250]:
Year quarter
0 2014 q1
1 2015 q2
In [251]: df = pd.concat([df] * 10**5)
In [252]: df.shape
Out[252]: (200000, 2)
UPDATE: график времени Pandas 0.23.0
UPDATE: новые тайминги с использованием Pandas 0.19.0
Сроки без CPU / GPU (отсортировано от самого быстрого до самого медленного):
In [107]: %timeit df['Year'].astype(str) + df['quarter']
10 loops, best of 3: 131 ms per loop
In [106]: %timeit df['Year'].map(str) + df['quarter']
10 loops, best of 3: 161 ms per loop
In [108]: %timeit df.Year.str.cat(df.quarter)
10 loops, best of 3: 189 ms per loop
In [109]: %timeit df.loc[:, ['Year','quarter']].astype(str).sum(axis=1)
1 loop, best of 3: 567 ms per loop
In [110]: %timeit df[['Year','quarter']].astype(str).sum(axis=1)
1 loop, best of 3: 584 ms per loop
In [111]: %timeit df[['Year','quarter']].apply(lambda x : '{}{}'.format(x[0],x[1]), axis=1)
1 loop, best of 3: 24.7 s per loop
Сроки с использованием оптимизации CPU / GPU:
In [113]: %timeit df['Year'].astype(str) + df['quarter']
10 loops, best of 3: 53.3 ms per loop
In [114]: %timeit df['Year'].map(str) + df['quarter']
10 loops, best of 3: 65.5 ms per loop
In [115]: %timeit df.Year.str.cat(df.quarter)
10 loops, best of 3: 79.9 ms per loop
In [116]: %timeit df.loc[:, ['Year','quarter']].astype(str).sum(axis=1)
1 loop, best of 3: 230 ms per loop
In [117]: %timeit df[['Year','quarter']].astype(str).sum(axis=1)
1 loop, best of 3: 230 ms per loop
In [118]: %timeit df[['Year','quarter']].apply(lambda x : '{}{}'.format(x[0],x[1]), axis=1)
1 loop, best of 3: 9.38 s per loop
Я бы рекомендовал eventlet и зеленые потоки для этого.
Twisted - хорошая библиотека, но небольшая крутая кривая обучения для такого простого использования.
Ознакомьтесь с некоторыми примерами здесь .
Попробуйте, прежде чем принимать, установите тайм-аут на сокет:
comSocket.settimeout(5.0)
try:
rawData = comSocket.recv(512)
except socket.timeout:
print "No response from server"
Вы можете попробовать тайм-аут, например, код Russel, или вы можете использовать неблокирующий сокет, как показано в приведенном ниже коде. Он никогда не будет блокироваться в socket.recv
, и вы можете использовать его внутри цикла, чтобы повторять столько раз, сколько захотите. Таким образом, ваша программа не будет зависать при таймауте. Таким образом, вы можете проверить, доступны ли данные, а если нет, вы можете делать другие вещи и повторять попытку позже.
socket.setblocking(0)
while (retry_condition):
try:
data = socket.recv(512)
except socket.error:
'''no data yet..'''