PythonのRuntimeWarningとは?await忘れ・空データの平均・オーバーフローの対処法

先に結論です。RuntimeWarning はエラーではありません。プログラムは止まらず、最後まで動きます。ただし「結果が期待どおりでない可能性がある」という警告なので、無視すると間違った数値のまま処理が進みます。

RuntimeWarningとは

Warning の一種で、実行時におかしな状況を見つけたときに出ます。例外と違って処理は中断されません。

例外(Error) 警告(Warning)
処理 止まる 止まらない
出力先 標準エラー+トレースバック 標準エラー(1回だけのことが多い)
気づきやすさ 必ず気づく 見逃しやすい
放置すると 動かない 間違った結果のまま進む
警告のほうが厄介だと考えてください

よく見る3つのRuntimeWarning

1. coroutine … was never awaited

import asyncio

async def f():
    return 1

f()    # await を忘れている
RuntimeWarning: coroutine 'f' was never awaited

非同期関数を呼んだのに await を付け忘れています。async def の関数は、呼んだだけでは実行されません。コルーチンという「これから実行するもの」が返るだけです。

# 直し方1:await を付ける(async 関数の中から)
result = await f()

# 直し方2:同期のコードから呼ぶ
result = asyncio.run(f())

この警告は「何も実行されていない」ことを意味します。エラーが出ないので正常に見えますが、処理が丸ごと抜け落ちています。非同期処理で結果がおかしいときは、まずこの警告を探してください。

2. Mean of empty slice

import numpy as np
print(np.mean([]))
RuntimeWarning: Mean of empty slice
nan

空のデータの平均を計算しようとしています。0個の平均は定義できないため、NumPyは nan(非数)を返して警告します。

原因はたいてい「絞り込んだ結果が0件だった」ことです。フィルタの条件を見直すか、計算前に件数を確認してください。

data = values[values > 100]
if len(data) == 0:
    print("該当なし")
else:
    print(data.mean())

NumPyの類似の警告には次のものがあります(NumPyのソースで確認)。

メッセージ 意味
Mean of empty slice 空のデータの平均
All-NaN slice encountered 全部が nan だった
Degrees of freedom <= 0 for slice 標準偏差を出すのにデータが足りない
invalid value encountered in ... 0÷0など、結果が nan になった
divide by zero encountered in ... 0で割った(inf になる)
overflow encountered in ... 数が大きすぎて表現できない
2026年9月24日時点。どれも「結果が信用できない」というサインです

NumPyは0で割っても止まりません。素のPythonならZeroDivisionErrorで止まりますが、NumPyは警告を出して inf や nan を返し、そのまま計算を続けます。最終結果だけ見ても気づけません。

3. overflow encountered in …

計算結果が扱える範囲を超えました。NumPyの int64 や float64 には上限があります。

対処は型を大きくするか、対数を取るなど計算方法を変えることです。素のPythonの整数は上限がないため、この問題は起きません。

警告を「見逃さない」設定にする

Pythonの警告は既定で1回しか表示されません。ループの中で1000回起きても、画面には1回だけです。

# 毎回表示する
python -W always your_script.py

# 警告をエラーに変えて止める(原因を特定したいとき)
python -W error::RuntimeWarning your_script.py

原因の行を特定したいときは -W error が最短です。警告が例外になるので、トレースバックで発生箇所が分かります。

NumPyだけ厳しくする

import numpy as np

# 0除算やオーバーフローを例外にする
np.seterr(all="raise")

# 一部だけ無視したい場合
with np.errstate(divide="ignore"):
    result = a / b

警告を消すこと自体を目的にしないでください。warnings.filterwarnings("ignore") で全部消すのは簡単ですが、本当に見るべき警告まで消えます。消すなら種類と発生箇所を限定してください。

よくある質問

RuntimeWarningは無視していいですか?

いけません。「結果が期待どおりでない可能性がある」という意味です。内容を読んで、意図した動作かどうかを必ず確認してください。

RuntimeErrorとは違いますか?

まったく別物です。RuntimeError は例外で処理が止まります。RuntimeWarning は警告で止まりません。名前が似ているだけです。

警告が1回しか出ません

Pythonの既定の動作です。同じ場所の同じ警告は1回だけ表示されます。python -W always で毎回表示できます。

どの行で出ているか分かりません

python -W error::RuntimeWarning で実行してください。警告が例外になり、トレースバックに発生箇所が出ます。

関連記事

0除算についてはZeroDivisionError、閉じ忘れの警告はResourceWarningをご覧ください。

Pythonのエラー全般はPythonでよく出るエラー一覧、例外処理の書き方はPythonの例外処理(try except)、警告の扱い方はPythonのWarningにまとめています。

テックジムは月額22,000円の通い放題でプログラミング教室を運営しています。東京本校(永田町)では毎週土曜にゼロから始めるPython入門講座、そしてゼロから始めるClaude Code講座を無料で開いています。どちらも説明会ではなく実際に手を動かす講座です。

まとめ

RuntimeWarning は止まらないが結果が怪しいという警告です。止まらないぶん、エラーより危険だと考えてください。

よく見るのはawait忘れ、空データの平均、オーバーフローの3つです。原因の行を知りたいときは python -W error::RuntimeWarning で実行すれば、トレースバックが出ます。

プログラミング学習に興味がある方は、まずは無料体験会へ

無料体験会・お申し込みはこちら